CreateFile()
WriteFile()
ReadFile()
- CreateFile() : 파일 오픈
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTE lpSecurityAttributes,
DWORD dwCreationDispostion,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile );
lpFileName : 생성 또는 오픈할 파일의 경로와 파일이름
dwDesiredAccess : 파일 접근 모드
dwShareMode : 파일을 공유할지의 여부를 결정하는 플래그
lpSecurityAttributes : 보안속성을 지정하는 인수. 주로 NULL 대입
dwCreationDispostion : 파일 존재에 따른 행동 설정
dwFlagsAndAttributes : 파일의 속성 설정. 주로 FILE_ATTRIBUTE_NORMAL 사용
hTemplateFile : 생성된 파일에 대한 속성을 제공하는 템플릿. 주로 NULL 대입
반환형 : 파일 핸들 반환
- dwDesiredAccess : 파일 접근 모드 -
GENERIC_ALL |
모든 엑세스 권한을 가진다. |
GENERIC_EXECUTE |
실행 권한을 가진다. |
GENERIC_READ |
읽기 권한을 가진다. |
GENERIC_WRITE |
쓰기 권한을 가진다. |
DELETE |
삭제 권한을 가진다. |
READ_CONTROL |
사용자, 그룹, 임의 액세스 제어 목록이 읽기 권한을 가진다. |
WRITE_DAC |
임의 액세스 제어 목록이 읽기 권한을 가진다. |
WRITE_OWNER |
사용자가 쓰기 권한을 가진다. |
SYNCHRONIZE |
동기화 권한을 가진다. |
- dwShareMode : 파일을 공유할지의 여부를 결정하는 플래그 -
0 |
다른 프로세스의 접근 차단 |
FILE_SHARE_READ |
다른 프로세스의 읽기 권한 허가 |
FILE_SHARE_WRITE |
다른 프로세스의 쓰기 권한 허가 |
FILE_SHARE_DELETE |
다른 프로세스의 삭제 권한 허가 |
- dwCreationDispostion : 파일 존재에 따른 행동 설정 -
CREATE_NEW |
파일이 존재하지 않을 경우 새로운 파일을 만듭니다.
파일이 존재할 경우 ERROR_FILE_EXISTS (80) 오류를 발생시킵니다. |
CREATE_ALWAYS |
항상 새로운 파일을 만듭니다.
파일이 존재할 경우 새로운 파일로 덮어씌웁니다. |
OPEN_EXISTING |
파일이 존재할 경우에만 파일을 엽니다.
파일이 존재하지 않을 경우 ERROR_FILE_NOT_FOUND (2) 오류를 발생시킵니다. |
OPEN_ALWAYS |
무조건 파일을 엽니다.
파일이 존재하지 않을 경우 파일을 새로 만들고 엽니다. |
TRUNCATE_EXISTING |
파일이 존재할 경우 파일을 연 후 크기를 0으로 만듭니다.
파일이 존재하지 않을 경우 ERROR_FILE_NOT_FOUND (2) 오류를 발생시킵니다.
불러오는 프로세스는 dwDesiredAccess 인수의 GENERIC_WRITE 플래그가 있어야 합니다. |
- WriteFile() : 파일에 쓰기
- ReadFile() : 파일 읽기
BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped );
hFile : 파일 핸들
lpBuffer : data 버퍼
nNumberOfBytesToWrite : data 버퍼를 몇 바이트를 파일에 쓸건지
lpNumberOfBytesWritten : 실제로 파일에 몇 쓰여진 byte 수 저장
lpOverlapped : NULL(사용X)
반환형 : 성공시 TRUE, 실패시 FALSE 반환.
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped );
hFile : 파일 핸들
lpBuffer : data를 읽어올 버퍼
nNumberOfBytesToRead : 몇 바이트를 읽어 올지
lpNumberOfBytesRead : 실제로 읽은 data의 byte 수 저장
lpOverlapped : NULL
반환형 : 성공시 TRUE, 실패시 FALSE 반환.
ex)
#include <Windows.h>
#include <stdio.h>
#include <string.h>
int main()
{
HANDLE hFile;
DWORD dwWrite, dwRead;
char wdata[20] = "Hello World";
char rdata[20];
hFile = CreateFile(TEXT("test.txt"),GENERIC_READ|GENERIC_WRITE,0 ,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == INVALID_HANDLE_VALUE)
return 0;
WriteFile(hFile, wdata, strlen(wdata), &dwWrite, NULL);
ReadFile(hFile, rdata, dwWrite, &dwRead, NULL);
CloseHandle(hFile);
printf("%s",rdata);
}
위와 같이 예제를 실행 해보면 ReadFile에서 rdata 버퍼 시작점에서 read하지 않고 뒷부분부터 read해서 아래와 같이 이상한 결과가 나왔다. 무슨 문제인지 ..........