LISTORY

[윈도우즈 시스템 프로그래밍] 파일 I/O와 디렉터리 컨트롤(2) 본문

IT/윈도우 프로그래밍

[윈도우즈 시스템 프로그래밍] 파일 I/O와 디렉터리 컨트롤(2)

LiStoryTeller 2018. 10. 27. 18:50



뇌를 자극하는 윈도우즈 시스템 프로그래밍 책 관련 유투브 강의이다.


지난 시간에 이어 파일 I/O와 디렉터리 컨트롤 부분을 계속하겠다.


YouTube 주소 : 파일 I/O와 디렉터리 컨트롤(2)



파일 I/O와 디렉터리 컨트롤


파일 관련 기본 함수들


파일 생성 : CreateFile

입력 및 출력 :  ReadFile, WriteFile

파일 종료 : CloseHandle


파일 종료 시, CloseHandle 함수 호출해야 한다는 것은 파일 또한 커널에서 관리한다는 리소스라는 뜻이다.


파일 생성해도 커널 오브젝트 생성, 해당 커널 오브젝트의 Handle 반환 된다. 


파일의 어디까지 읽었는지 정보를 가지고 있는 파일포인터만해도 커널 오브젝트에 의해 관리된다.



파일 정보 얻어오기


GetFileTime

- 만든 날짜, 수정한 날짜, 엑세스한 날짜

- 핸들을 통해 정보 확인


GetFileAttributes

- 읽기 전용, 숨김, 보관

- 파일 이름을 통해 정보 확인


GetFileInformationByHandle

- 위 두 함수를 통해 얻을 수 있는 모든 정보 얻을 수 있다.

- 핸들을 통해 정보 확인


파일 정보는 핸들과 파일이름 둘 중 하나를 사용하여 얻을 수 있다.


일반적으로 많이 활용되는 것은 핸들이다.  더 유용하다.



파일 포인터의 이동


32비트 기반

- SetFilePointer(hFile, sizeof(TCHAR)*4, NULL, FILE_BEGIN);

- 파일 최대 크기 : 4G byte -2

- 4G byte-1 == INVALID_SET_FILE_POINTER(0xFFFFFFFF)


SetFilePointer는  64비트를 기반으로 만들어진 함수이다.

즉, 주소를 8바이트로 표현가능 하도록 설계되었다. 그래서 두번째 세번재 인자에 이어서 주소값 표현할 수 있도록 해두었다.


SetFilePointer는 fseek 함수와 동일한 기능(포인터 이동)을 하는 함수이다.


각각의 인자에 들어가는 값은 이렇다.


첫번째 전달 인자: 포인터를 옮기고 싶은 파일의 핸들정보

두번째 전달 인자: 주소값 앞 부분

세번째 전달 인자: 주소값 뒷 부분

네번째 전달 인자: 어디서부터 옮길거냐


32비트로 표현하는 주소값의 범위는 0~2의32승(4기가) - 1 번지이다.

즉, 실제 파일의 크기는 4기가 -1이다.


만일, SetFilePointer 함수 사용중에 문제가 생겼다. 그럼 어떻게 구분할 수있을까?


 INVALID_SET_FILE_POINTER이 반환이 된다.


이는 0xFFFFFFFF값을 갔는데, 이게 4기가-1이다.


근데 실제 이게 파일 크기인지 메모리 주소인지 구분 할 수 없다. 그래서 이 값은 사용됐을 때 오류임을 나타내는 것으로 약속하였다.


그래서 실제 메모리는 4기가-2이다.



64비트 기반

- SetFilePointer(hFile, IDistanceLow, &IDistanceHigh, FILE_BEGIN);

- 4G byte -1의 검사

  dwPtrLow = SetFilePointer(....)

if((dwPtrLow == INVALID_SET_FILE_POINTER)

&& ( GetLastError()!=NO_ERROR)) {진짜 오류}


SetFilePointer는 4바이트 리턴한다. 


하지만 64비트 버전에서는 8바이트의 주소값을 리턴해야 한다. 이를 위새,


낮은 사바이트는 반환값을 통해, 상위 사바이트는 세번째 전달 인자를 통해 얻게된다.


그래서 이 두개를 묶어줘야 한다.






Comments