CreateFile은 Windows Api 들 중 가장 기본적이면서도 중요한 함수이다.

이 함수는 파일을 생성하는 것뿐만이 아니라 파일을 오픈할 수도 있고 디렉터리를 오픈할 수도 있으며 다른 여러 디바이스들까지 오픈할 수 있다.
사실 CreateFile에서 File은 꼭 파일만이 아닌 여러 디바이스들을 추상화한 Virtual File을 뜻하는 셈이다.

이 함수를 통해 파일을 여는 순간에 동기 I/O를 할지 비동기 I/O를 할지 결정하게 된다.
내가 어떤 작업을 하려는지, 내가 파일을 열고 있는 동안 다른 클라이언트들에게는 어떤 작업을 허용할지도 결정하게 된다.
생성하려는 파일의 읽기 전용, 숨김 파일 등의 속성도 정할 수 있으며,
캐시를 이용할지 말지, 쓰기를 하는 족족 플러시 하게 할지
또는 I/O를 순차적으로 할지 랜덤 하게 할지 등의 힌트도 파일 시스템으로 전달해줄 수 있다.

이렇게 중요한 함수니만큼 MSDN에는 CreateFile에 대한 문서가 아주 잘 나와있다.
페이지 내의 링크들까지 하나하나 따라가면서 차근차근 읽다 보면 윈도우 시스템 프로그래밍에 대해 많이 배울 수 있다.

하지만 글만 읽고서 지식을 자기 것으로 만들 수는 없는 법.
다 이해한 것 같아도 막상 해보려고 하면 또 어려운 문제가 닥치기 마련이며 이 것까지 해결하고 나서야 비로소 완전히 자기 걸로 만들었다고 할 수 있다.

CreateFile의 파라미터는 몇 개 안 되는 것 같지만 플래그들의 조합이 가능하기 때문에 사실은 적은 개수가 아니다.
실습을 해보기 위해서 항상 무거운 비주얼 스튜디오를 켜고 그 지겨운 파라미터들을 매번 입력하는 것은 손가락도 아프고 시간도 많이 들어가는 비효율적인 방식이다.

이런 실습을 위해 누군가가 이미 훌륭한 프로그램을 만들어놓았다.
이는 프로세스 모니터와 함께 내가 가장 즐겨 쓰는 도구들 중 하나이다.
아픈 내 손가락을 조금이나마 쉴 수 있게 해주는 고마운 친구.


FileTest.exe

위 그림에서 보이는 것처럼 CreateFile 함수 형태 그대로 UI를 제공하고, 실험해보고 싶은 모든 플래그 조합을 넣어볼 수 있다. 파일 생성뿐 아니라 읽기 쓰기도 해 볼 수 있으며 더 저수준 함수인 NtCreateFile까지도 다루어볼 수 있다.

우측의 버튼들을 클릭하면 아래처럼 또 다른 대화 상자가 나와서 CreateFile의 많은 옵션들을 손쉽게 넣어서 테스트할 수 있다.

파일 시스템과 관련이 있는 일은 하는 사람들은 두말할 것도 없고, Windows 플랫폼에서 개발하는 모든 개발자들이 알아두면 좋을 훌륭한 도구이다.