원형 |
HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES pSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MFC 원형 |
해당하는 함수 없음 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
인수 |
▶lpFileName : 생성하고자 하는 파일(또는 오브젝트)의 이름을 지정한다. 오브젝트의 이름은 최대 MAX_PATH의 길이로 지정할 수 있으나 NT/2000에서 유니코드로 컴파일할 경우는 32000자까지의 길이를 사용할 수 있다. 이때 파일명은 "\\?\"로 시작되어야 한다. 파일의 경우 완전 경로를 줄 수도 있고 현재 디렉토리를 기준으로 한 상대 경로로 줄 수도 있다. ▶dwDesiredAccess : 파일에 대한 액세스 권한을 지정한다. 생성하거나 연 파일로 어떤 작업을 할 것인가에 따라 적절한 액세스 권한을 지정해야 한다. 다음 플래그 중 하나 또는 조합을 지정할 수 있는데 이 플래그들은 모든 오브젝트에 공통적으로 적용되는 일반형 권한이다.
액세스 권한은 가급적이면 최소한으로 요청하는 것이 좋다. 예를 들어 읽기만 할 용도로 파일을 연다면 GENERIC_READ 플래그만 주어야 한다. 불필요하게 읽기와 쓰기 액세스 권한을 동시에 요청할 경우 읽기 전용 파일이나 CD-ROM의 파일을 열지 못하게 된다. 이런 일반형 권한 외에 오브젝트 고유의 권한을 같이 지정하거나 아니면 일반형 권한없이 표준 권한과 고유형 권한으로 액세스 마스크를 구성할 수도 있다. 각 오브젝트의 고유한 권한에 대해서는 해당 오브젝트를 참조하기 바란다. ▶dwShareMode : 파일의 공유 모드를 지정한다. 공유 모드란 파일이 열려져 있는 상태에서 다른 프로세스가 또 이 파일을 오픈할 때 이를 허가할 것인가 아닌가를 지정한다. 만약 현재 프로세스가 파일을 쓰고 있는 상태에서 다른 프로세스가 파일을 읽을 수 없도록 하고 싶다면 공유 모드를 지정하지 않아야 한다. 다음 플래그들의 조합으로 공유 모드를 지정한다.
▶pSecurityAttributes : 파일의 보안 속성을 지정하는 SECURITY_ATTRIBUTES 구조체의 포인터이다. 이 보안 속성에 따라 생성되는 파일의 보안 설명자가 달라지며 차일드 프로세스로 핸들을 상속할 수 있는가의 여부가 결정된다. NULL이면 핸들은 상속될 수 없으며 디폴드 보안 설명자가 할당된다. 단, 파일의 보안 설명자가 할당되기 위해서는 파일이 저장되는 디스크의 파일 시스템이 반드시 NTFS로 포맷되어 있어야 한다. ▶dwCreationDisposition : 파일을 생성할 것인지 열 것인지를 지정한다. 또한 생성하고자 하는 파일이 이미 존재하거나 또는 열고자 하는 파일이 없을 경우의 동작을 지정한다. 적절한 에러를 리턴받기 위해서는 이 플래그를 신중하게 잘 지정해 주어야 한다. 그렇지 않으면 없는 파일이 열리거나 기존 파일이 깨지는 등 프로그램이 오동작을 할 위험이 있다.
▶dwFlagsAndAttributes : 생성할 파일의 속성 또는 기타 옵젝트이 속성을 지정한다. 파일의 속성은 다음 플래그들의 조합을 사용할 수 있다.
파일 속성과 함께 다음 플래그들도 같이 지정할 수 있다.
▶hTemplateFile : 생성될 파일의 속성을 제공할 템플릿 파일이다. 95/98은 템플릿 파일을 지원하지 않으므로 반드시 NULL이어야 한다. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
리턴 |
생성 또는 연 파일의 핸들을 리턴한다. 실패할 경우 INVALID_HANDLE_VALUE를 리턴하는데 이 값은 NULL과는 다르므로 NULL과 비교해서는 안된다. 즉 다음과 같은 에러 처리는 잘못된 것이므로 주의하기 바란다. hFile=CreateFile(... 이 함수를 출하기 전에 파일이 이미 존재하고 있었으면 GetLastError는 ERROR_ALREADY_EXISTS를 리턴한다. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
설명 |
이 함수는 파일을 생성하는 가장 기본적인 함수이다. 그러나 이름과는 달리 파일을 생성하는 것뿐만 아니라 기존의 파일을 열 수도 있으며 파일 외에 다음과 같은 오브젝트를 생성하거나 열 수도 있다. 파이프 이 함수로 생성한 핸들은 반드시 CloseHandle로 닫아 주어야 한다. 다음 예제는 파일을 생성하고 파일에 텍스트를 기록한다. LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; HANDLE hFile; DWORD dwWritten; LPCTSTR str=TEXT("테스트 파일입니다"); switch(iMessage) { case WM_LBUTTONDOWN: hFile=CreateFile("c:\\TestFile.txt",GENERIC_WRITE,0,NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); WriteFile(hFile,str,lstrlen(str),&dwWritten,NULL); CloseHandle(hFile); return 0; case WM_PAINT: hdc=BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return(DefWindowProc(hWnd,iMessage,wParam,lParam)); } C드라이브의 루트 디렉토리에 TestFile.txt 파일을 쓰기 액세스 권한으로 생성하였다. CREATE_ALWAYS 플래그를 주어 파일이 있을 경우 새로 만든다. 예제를 실행한 후 TestFile.txt 를 확인해 보면 문자열이 기록되어 있을 것이다. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
참고함수 |
ReadFile : 파일로부터 데이터를 읽는다. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
플랫폼 |
95이상 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
참조 |
액세스 권한에 대한 상세한 내용은 39-2-사절을 참고하기 바란다. [출처] CreateFile | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'프로그래머의 길 > C & C++' 카테고리의 다른 글
Visual C++에서 CVS에 올려야 할 것과 올리지 말아야 할것 (0) | 2008.04.23 |
---|---|
더 나은 코드 주석을 위한 13가지 팁 (0) | 2008.04.22 |
atan2 (0) | 2008.04.22 |
SetBkMode (0) | 2008.04.21 |
GetTextExtentPoint (0) | 2008.04.21 |