Win32 파일 시스템
파 일 시 스 템과 간 단 한 터 미 널 I / O는 대 개 의 경 우 개 발 자 들 이 부 닥 치 는 첫 번째 운 영 체 제 부 분 이 다. M S - D O S와 같은 초 기의 P C 운 영 체 제 들 은 파 일 과 터 미 널 (또는 콘솔) I/O를 관리하는 것이 대부분의 기능이었으며, 현재의 거의 모든 운 영체제에서도 이 자원들은 여전히 중심 기능으로 자리 잡고 있다.
파 일 은 데 이 터 와 프 로 그 램의 장 기 보 관 소로서 필 수 적 이 며 , 가 장 간 단 한 프로 그 램과 프로그램 사이의 통신 형태이기도 하다. 또한,파일 시스템 모델의 많은 측면이 프로세스 간 및 네트워크 통신에 적용되고 있다.
모 든 파 일 시 스 템 은 같 은 방 법 으 로 접 근 하 지 만 , 약 간 의 제 한 이 있다. 예를 들 어 , N T F S 만 이 보 안을 지 원 한 다. 이 책에 서는 N T F S에 서 만 지 원 되는 특 징 들을 해당 부분에서 지적하도록 한다.
디스크 볼륨과 파티션으로서의 파일 시스템 포맷은 디스크가 파티션될 때 결정된다. 하나의 디스크는 처음 두 파일 시스템의 어떠한 혼합으로도 파티션 이 될 수 있다.
Win32 파일명
W i n 3 2 는 계 층 적 파 일 명 을 지 원 한 다. 그 러 나 U N I X 경 우 와 는 약 간 의 차 이 가 있으며 다음과 같은 일반적 원칙이 있다.
• 디스크 파일의 완전(full) 경로명은 A: 또는 이와 같은 드라이브명부터 시작한다. 시와 B: 드라이브는 정상적인 경우 디스켓 드라이브이며, C:, D: 등 은 하 드 디 스 크 와 C D - R O M을 나 타 낸 다. 네 트 워 크 드 라 이 브 는 대 개 … 와 K: 같이 알파벳 순서에 의해 뒤에 나오는 문자로 나타낸다.
• 다 른 방 법 으 로 는 , 완 전 경 로 명 이 전 역 루 트 ( r o o t )를 나 타 내 는 백 스 러 쉬 두 개로 시 작 하 고 , 네 트 워 크 파 일 서 버에 서 의 경로 를 나 타 내 는 서 버 이 름 과 공 유 이 름 이 뒤 이 어 오 는 형 태 가 있다. 따 라 서 , 경로 명의 앞 부 분 은 \\servername\sharename] 된다.
• 경로명에서의 분리문자는 백스러쉬 (\)이다. 그러나 API 인자에서는 스러쉬 (/)가 쓰일 수도 있으며, 이것이 C에서는 보다 편리하다.
• 디렉토리와 파일명은 1과 31 사이의 값을 갖는 ASC II 문자나, 아래와 같은 문자를 포함해서는 안된다.
< > :" |
이름에 빈칸(blank)이 들어가는 것은 무방하지만, 이 책의 대부분 프로그램 은 파일명에 빈칸을 포함하지 않는다. 빈칸은 사용하지 않는 것이 좋다.
• 디렉토리와 파일명에서 소문자와 대문자는 구분되지 않는다. 그러나, 생성할 때 이름을 MyFil e로 주었다면,그 이름 그대로 생성된다. 물론 파일 자체는 myFILE이라는 이름으로도 접근이 가능하다.
• 파일과 디렉토리명은 256자까지 가능하다少
• 마 침 표 (. )는 파 일 명 과 확 장 자를 구 분 하 며 , 확 장 자는 대 개 파 일 의 타 입을 나 타 낸 다. 따 라 서 , a t o u. E X E는 실 행 파 일 을 , a t o u. C는 C 언 어 소 스 파 일 을 나타낸다.
•. 과.. 은 디렉토리명으로서 현재 및 부모 디렉터리를 각각 나타낸다.
파일 열기, 읽기, 쓰기 및 닫기
처 음 으 로 자 세 히 설 명 하 는 W i n 3 2 함 수는 C r e a t e F i l e 이 다. 이 함 수는 존 재 하 는 파 일 을 열 고 , 새 로 운 파 일 을 생 성 하 는 데 사 용 된 다. 함 수 의 설 명 은 함 수 프로 토타 입을 먼저 보이고,인자들과 동작을 설명하는 순서로 이루어진다.
파일의 열기와 생성
처 음 나 오 는 W i n 3 2 함 수 이 기 때 문 에 자 세 히 설 명 하 도 록 하 며 , 뒤에 나 오 는 함 수 들의 설 명 은 같은 맥 락에 서 이 해 하 기 바 란 다. 추 가로 자 세 한 사 항을 알 고 싶으면 온라인 도움말을 찾아보면 된다.
HANDLE CreateFile (LPCTSTR IpszName,
DWORD fdwAccess, DWORD fdwShareMode,
LPSECURITY ATTRIBUTES Ipsa,
DWORD fdwCreate,
DWORD fdwAttrsAndFlags,
HANDLE hTemplateFile)
리턴 값 : 열린 파일 객체에 대한 HANDLE이나 실패한 경우 INVALID_HANDLE_VALUE를 리턴한다
<인자>
인자의 이름들은 Win32 관례의 일부분을 보여주고 있다. 접두어 fdw는 DWORDlpszName은 파일,파이프, 또는 다른 이름을 갖는 객체를 열거나 생성하기
위해서 명명하는 널 (null) 로 끝나는 스트링의 포인터이다. 경로명은 대개 ___PATH (260) 문자로 제한되지만, 윈도 NT에서는 경로명에 \\?\ 접두어를
붙이면 이 제한을 벗어나서 매우 긴 이름을 (32K까지) 사용할 수 있다. 이 때 접두어는 이름의 일부분이 아니다.
fdwAccess는 GENERIC_READ와 GENERIC_WRITE를 사용하여 읽기 쓰기 접근을 규정한다. 이 값들은 비트단위 OR 연산을 통해 합쳐질 수 있다. 예를 들어, 파일을 읽기와 쓰기 접근으로 열려면 다음과 같이 한다:
GENERIC_READ | GENERIC_WRITE
fdwShareMode는 다음과 같은 값들의 비트단위 OR 조합이다.
• 0 — 파일은 공유되지 않는다. 더 나아가서 같은 프로세스조차도 이 파일을 두 번째 핸들로 열 수 없다.
• FILE_SHARE_READ — 이 호출을 하는 프로세스를 포함하여 다른 프로세스 가 동시 읽기 접근으로 파일을 오픈할 수 있다.
• FILE_SHARE_WRITE — 파일에 대한 동시 쓰기 접근이 허용된다.
파일 잠금(lock) 또는 다른 기법을 사용하여,프로그래머는 같은 파일 위치에 대해 동시에 갱신이 발생하지 않도록 주의를 하여야 한다.
Ipsa는 SECURITY_ATTRIBUTES 구조를 가리킨다. 현재로서는 NULL 값을 사용하도록 한다.
fdwCreate는 새로운 파일을 생성할 것인지,기존 파일에 덧쓰기를 할 것인 지 등에 대해 규정한다. 각 값들은 C의 비트단위 OR 연산으로 조합된다.
• CREATE_NEW_- 지정한 파일이 이미 있으면 실패한다' 그렇지 않다면 파일을 생성한다.
• CREATE__ALWAYS — 기존 파일에 덧쓰기 한다•
• OPEN_EXISTING — 파일이 존재하지 않으면 실페 한디-.
• OPEN_ALWAYS — 파일이 존재하지 않으면 생성하면서 오픈한다
• TRUNCATE_EXISTING — 파일 길이가 0이 된다. 이때,fdwAccess — 소한 GENERIC_WRITE 접근이 설정되어야만 한다.
f dwAttr sAndFlags는 파일 속성 과 플래그산 규정한다. 16개 의 플래그 속성이 있는 데,그중 중요한 것 몇 개를 살펴보면 다음과 같다.
• FILE_ATTRIBUTE_NORMAL — 아무 파일 속성도 설정하지 않올 때 사용 다. (플래그는 설정될 수 있다.)
• FILE_ATTRIBUTE_READONLY — 웅용이 파일에 쓸 수 없으며 지울 수 없다.
• FILE_FLAG__DELETE_ON_CLOSE — 이 것은 임시 파일에 유용하다. 마지 열린 핸들이 닫힐 때, 파일은 삭제된다.
• FILE_FLAG__OVERLAPPED — 이 속성 플래그는 13장에서 설명할 비동 I/O에서 중요하다. 윈도우95에서는 직렬!八) 장치인 경우를 제외하고는 다시 NULL이어야 한다.
파일을 어떻게 처리할 것인지를 규정하고,성능과 파일의 순결성 유지 Win32 구현이 최적화할 수 있도록 하여주는 플래그들도 있다.
• FILE_FLAG_WRITE__THROUGH — 중간에 있는 캐쉬가 디스크에 있는 엇 로 직접 쓰인다.
• FILE__FLAG_NO_BUFFERING — 사용자 영역에서의 중간 버퍼 링이나 키 이 없으며,데이터 전송이 프로그램 버퍼로부터 직접 수행된다. 따라서,4 (sector) 범위의 버퍼가 필요하며 섹터 전부가 전송되어야만 한다. o] 불 그를 사용할 때 섹터의 크기를 알려면 GetDiskFreeSpace 함수를 사용한
4) 속성은,HANDLE과는 반대로, 파일의 특징을 나타내며’ 기존 파일을 오픈할 때는 무시된다.
• FILE__FLAG_RANDOM__ACCESS — 파일은 임의 접근 형식으로 사용되며,윈 도우즈가 이에 맞게 파일 캐슁을 최적화한다.
• FILE_FLAG_SEQUENTIAL_SCAN — 파일은 순차 접근 형식으로 사용되며, 윈 도 우 즈 는 이 에 따 라 파 일 캐 쉽 을 최 적 화 한 다. 마 지 막에 설 명 한 두 접 근 형식을 반드시 규정하여야 하는 것은 아니다.
hTemplateFile은 GENERIC_READ로 오픈된 파일의 핸들로서,이 파일의 속 성 이 새 로 생 성 되 는 파 일 에 적 용 되는 확 장 된 속 성을 규 정 한 다. 이 경 우 fdwAttrsAndFlags는 무시된다. 이 인자는 대개는 NULL이다. 기존의 파일을 오 픈 할 때는 이 인 자는 무 시 된 다. 이 인 자는 기 존 파 일 과 같은 속 성 으 로 새 로 운 파일의 속성을 설정하려고 할 때 사용될 수 있다.
만 일 속 성 과 보 안 이 허 용을 한 다 면 , 하 나 의 파 일 에 대 해 많은 오 픈 핸 들 이 있을 수 있 다 는 점에 주의 하 여 야 한 다. 이 핸 들 들 은 같은 프로 세 스 가 또 는 다른 프로세스들이 소유할 수 있다.
파일 닫기
BOOL CloseHandle (HANDLE hObject)
리턴 값 : 함수가 성공하면 TRUE, 아니 연 FALSE
거의 모든 객체에 대해 핸들을 닫고 무효화시키는 작업에는 하나의 만능 함수 가 사용된다. 예외가 있으면 따로 표시될 것이다.
핸들을 닫으면 객체 핸들 개수가 감소하며,임시 파일 이 나 이 벤트와 같은 지속적이지 않은 객 체는 삭 될 수 있다.
시스템은 종료 시에 모든 오픈된 핸들을 닫는다 그러나 프로그램 이 자신이 종료할 때 자신의 핸들을 닫는 것이 보통이다
파일 일기
BOOL ReadFile (HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED IpOverlapped)
리턴 값 : 읽기가 성공하면 (파일 끝을 지나서도 읽기를 시도할 수 있으므로 읽을 바이트가 없는 경우도 포함) TRUE
별다른 표시가 없으면 파일 핸들에는 fdwAttrsAndFlags에 FILE__FLAG_ OVERLAPPED 옵션이 설정되어 있지 않다고 가정한다. 디스크 파일의 경우,Win95 에서는 이 가정은 항상 유효하다. 따라서,ReadFile은 해당 핸들이 가리키는 현 재의 위치에서 시작하며,전송된 바이트 수만큼 위치를 앞으로 전진시킨다.
<인자>
변수 이름이 길고 인자들의 배열이 자연스럽게 배열되어 있기 때문에 특별한 설명은 필요 없을 것이다. 약간의 간단한 설명을 덧붙인다면 다음과 같다.
hFile은 GENERIC_READ 접근을 갖고 있는 핸들을 나타낸다. lpBuffer는 입력 데이터를 받을 메모리 버퍼를 가리킨다. nNumberOfBytesToRead는 파 일로부터 읽어올 바이트의 수를 나타낸다.
l p N u m b e r O f B y t e s R e a d는 이 번 R e a d F i l e 호 출 에 서 읽어 온 실 제 숫 자의 포인터이다. 만일 HANDLE이 파일 끝에 위 치 하고 있다면 이 값은 0이 될 수 있 다. 메시지 모드의 이름을 갖는 경우에도 길이가 0인 메 시지를 읽어오는 경우가 있다.
IpOverlapped는 OVERLAPPED 구조에 대한 포인터이다. 현재로서는 NULL을 사용한다.
파일 쓰기
BOOL WriteFile (HANDLE hFile,
CONST VOID *lpBuffer,
DWORD nNumberOfBytesToWr ite,
LPDWORD lpNuniberOfBytesWr itten,
LPOVERLAPPED IpOverlapped)
리턴 값 : 함수가 성공하면 TRUE, 아니면 FALSE
CreateFile때 FILE_FLAG_ WRITE__THROUGH로 규정하지 않았다면,성공적인 쓰기가 데이터가 실제로 디스크에 쓰였다는 것을 보장하는 것은 아니라는 점을 주의하기 바란다. 만일 핸들이 파일 끝에 위치하고 있다면,Win32는 기존 파일의 길이를 증가시킨다.
'IT & 프로그래밍 > Win32시스템프로그래밍' 카테고리의 다른 글
Win32 시스템 프로그래밍 시작하기 (0) | 2022.03.10 |
---|---|
윈도우NT와 윈도우95 (0) | 2022.03.09 |
댓글