본문 바로가기
IT

CreateFile(), ReadFile(), WriteFile()

by %? 2020. 10. 2.

CreateFile()

- 파일이나 입출력 장치를 새로 만들거나 열 때 사용하는 함수

- 가장 일반적으로 쓰이는 입출력 장치는 파일, 파일 스트림, 디렉터리, 물리적 디스크, 볼륨, 콘솔 버퍼, 테이프 드라이브, 통신 리소스, 메일 슬롯, 파이프 등이다.

- 이 함수는 파일이나 장치 및 지정된 플래그와 속성에 따라 다양한 유형의 I/O에 대한 파일이나 장치에 액세스하는 데 사용할 수 있는 핸들을 반환한다.

 

형태

HANDLE CreateFileA(

    LPCSTR lpFileName,

    DWORD dwDesiredAccess,

    DWORD dwShareMode,

    LPSECURITY_ATTRIBUTES lpSecurityAttributes,

    DWORD dwCreationDisposition,

    DWORD dwFlagsAndAttributes,

    HANDLE hTemplateFile

);

 

매개변수

lpFileName : 생성하거나 열고자 하는 파일이나 디바이스의 이름. /\를 붙일 수 있다.

 

dwDesiredAccess : 파일이나 디바이스의 접근 권한 지정

- GENERIC_READ : 읽기

- GENERIC_WRITE : 쓰기

- GENERIC_READ | GENERIC_WRITE : 읽기와 쓰기 둘 다

- 0 : 둘 다 안 한다.

 

dwShareMode : 파일이나 디바이스의 공유 모드 지정(0x0000000*)

- 0(0) : 다른 프로세스가 읽기, 쓰기, 삭제 못 하도록 막기

- FILE_SHARE_READ(1) : 다른 프로세스의 읽기 권한 지정

- FILE_SHARE_WRITE(2) : 다른 프로세스의 쓰기 권한 지정

- FILE_SHARE_DELETE(4) : 다른 프로세스의 삭제 권한 지정

 

lpSecurityAttributes : 파일의 보안 속성을 지정하는 구조체 포인터(자식한테 상속할 마음이 없으면 NULL)

 

dwCreationDisposition : 존재하거나 존재하지 않는 파일 또는 디바이스에 대해 수행할 작업

- CREATE_NEW(1) : 파일이 존재하지 않을 때만 새로운 파일 생성

- CREATE_ALWAYS(2) : 항상 새로운 파일을 생성

- OPEN_EXISTING(3) : 파일이나 디바이스가 존재하면 열기

- OPEN_ALWAYS(4) : 항상 파일을 열기

- TRUNCATE_EXISTING(5) : 파일이 존재하면 0바이트가 되도록 자르고 열기

 

dwFlagsAndAttributes : 생성할 파일이나 디바이스의 속성 또는 기타 객체의 속성을 지정 (Attribute)

- FILE_ATTRIBUTE_ARCHIVE(32 (0x20)) : 쓰기 속성으로 생성

- FILE_ATTRIBUTE_ENCRYPTED(16384 (0x4000)) : 파일을 암호화하여 생성

- FILE_ATTRIBUTE_HIDDEN(2 (0x2)) : 숨김 파일로 생성

- FILE_ATTRIBUTE_NORMAL(128 (0x80)) : 아무런 속성이 없는 파일을 생성

- FILE_ATTRIBUTE_OFFLINE(4096 (0x1000)) : 데이터가 오프라인 상태로 즉시 사용 불가

- FILE_ATTRIBUTE_READONLY(1 (0x1)) : 읽기 전용 속성으로 생성

- FILE_ATTRIBUTE_SYSTEM(4 (0x4)) : 시스템 파일로 생성

- FILE_ATTRIBUTE_TEMPORARY(256 (0x100)) : 임시 파일로 생성

 

hTemplateFile : 새로 만들 파일의 속성을 제공할 템플릿 파일(안 써도 된다.)


ReadFile()

- 파일에 있는 데이터를 읽을 때 사용하는 함수

 

형태

ReadFile(

    HANDLE hFile,

    LPVOID lpBuffer,

    DWORD nNumberOfBytesToRead,

    LPDWORD lpNumberOfBytesRead,

    LPOVERLAPPED lpOverlapped

);

 

매개변수

hFile : 데이터를 읽을 파일의 핸들을 지정

lpBuffer : 읽은 데이터를 저장할 버퍼의 주소를 지정

nNumberOfBytesToRead : 파일로부터 읽고자 하는 데이터 크기를 바이트 단위로 지정

lpNumberOfBytesRead : 실제로 읽은 데이터 크기를 얻기 위한 변수의 주소를 지정

lpOverlapped : CreateFile() 함수의 전달인자


WriteFile()

- 파일에 데이터를 저장할 때 사용하는 함수

 

형태

WriteFile(

    HANDLE hFile,

    LPCVOID lpBuffer,

    DWORD nNumberOfBytesToWrite,

    LPDWORD lpNumberOfBytesWritten,

    LPOVERLAPPED lpOverlapped

);

 

매개변수

hFile : 데이터를 저장할 파일의 핸들을 지정

lpBuffer : 데이터를 저장하고 있는 버퍼의 주소를 지정

nNumberOfBytesToWrite : 파일에 저장하고자 하는 데이터 크기를 바이트 단위로 지정

lpNumberOfBytesWritten : 파일에 실제 저장된 데이터 크기를 얻기 위해 변수의 주소 지정

lpOverlapped : CreateFile() 함수의 전달인자


CloseHandle()

- 핸들을 닫을 때 사용하는 함수

 

형태

CloseHandle(

    HANDLE hObject

);

 

매개변수

hObject : 닫을 핸들 지정

 

 

참조한 사이트들

docs.microsoft.com/ko-kr/windows/win32/api/fileapi/nf-fileapi-createfilea?redirectedfrom=MSDN

blog.naver.com/PostView.nhn?blogId=power2845&logNo=50144496765

scytalezz.tistory.com/80

www.joinc.co.kr/w/man/4200/CreateFile

cinrueom.tistory.com/62

dpdpdpdpdpdp.tistory.com/239

www.soen.kr/lecture/win32api/reference/Function/CreateFile.htm

bbolmin.tistory.com/67

raisonde.tistory.com/entry/Windows-API-%ED%8C%8C%EC%9D%BC-%EC%97%B4%EA%B8%B0-%EC%9D%BD%EA%B8%B0-%EC%93%B0%EA%B8%B0-%EB%8B%AB%EA%B8%B0

robodream.tistory.com/190

hh-nn.tistory.com/42