ReadFile() / WriteFile() 개념
* ReadFile()
- 파일로부터 데이퍼를 읽기.
- 주로 동기적인 입력에 사용하기 때문에 데이터를 완전히 읽기 전에는 리턴하지 않는다.
- 비동기 입력에 사용할 경우는 즉시 리턴한다.
- 파일 포인터 위치에서부터 데이터를 읽으며, 다 읽은 후에는 실제 읽은 바이트 수만큼 파일 포인터를 이동시켜 준다.
- 단, 비동기 입출력 중에는 직접 파일 포인터를 이동시켜 주어야한다.
* 함수 원형
BOOL ReadFile(
HANDLE hFile, ----①
LPVOID lpBuffer, ----②
DWORD nNumberOfBytesToRead, ------③
LPDWORD lpNumberOfBytesRead, -----④
LPOVERLAPPED lpOverlapped ------⑤ );
① hFile
: 데이터를 읽고자 하는 파일의 핸들이다. 이때는 파일을 열때 GENERIC_READ Flag로 열어야한다.
② lpBuffer
: 읽는 데이터를 저장할 버퍼의 포인터이다. 크기가 충분하여야 한다.
③ nNumberOfBytesToRead
: 읽고자 하는 바이트 수이다.
④ lpNumberOfBytesRead
: 실제로 읽은 바이트 수를 리턴받기 위한 충력용 인수이다. ReadFile가 호출되면 이 값을 0으로 만들며 비동기 입출력을 하지 않을 경우에는 이값을 NULL로 중 수 없으며 반드시 DWORD형 변수에 대한 포인터를 제공하여야 한다.
⑤ lpOverlapped
: 비동기 입출력을 위한 OVERLAPPED 구조체의 포인트이다. 파일을 열떄 Flag 값을 FILE_FLAG_OVERLAPPED로 열었다면 반드시 이 값을 제공 하여야 한다. 비동기를 사용하지 않는다면 NULL을 주면 된다.
* WriteFile()
- 파일에 데이터를 기록한다.
- 주로 동기적인 출력에 사용하지만 OVRELAPPED 구조체를 제공하묜 비동기 입출력을 비동기 입출력을 할 수 있다. 파일 포인터가 가리키고 있는 지점에 데이터를 기록하며 기록을 완료한 후 실제 기록한 바이트 수만큼 파일 포인터를 이동시켜준다. 단 비동기 입출력중일때는 파일 포인터를 직접이동시켜 주여야한다. 또한 파일 뿐만이 아니라 파이프 소켓 통신포트 콘솔 등의 장치에도 데이터를 출력 가능하다.
* 함수 원형
BOOL WriteFile(
HANDLE hFile, ----①
LPCVOID lpBuffer, ----②
DWORD nNumberOfBytesToWrite, ----③
LPDWORD lpNumberOfBytesWritten , ----④
LPOVERLAPPED lpOverlapped ----⑤ );
① hFile
: 데이터를 기록하고자 하는 파일의 핸들값을 입력한다. 이 핸들은 GENERIC_WRITE 엑세스 권한으로 열어야 한다.
② lpBuffer
: 출력할 데이터를 가진 버퍼이다.
③ nNumberOfBytesToWrite
: 기록할 바이트 수를 지정한다. 파이프로 네트웨크 전송을 할 때에는 65535바이트까지 기록할 수 있다.
④ lpNumberOfBytesWritten
: 실제로 기록한 바이트 수를 리턴받기 위한 출력용 인수이다. 함수 호출시에 이 값을 무조건 0으로 만든다. 비동기 입출력을 하지 않을경우에는 NULL을 인수로 줄 수 없으며 반드시 DWORD형 변수의 포인퍼를 제공하여야 한다.
⑤ lpOverlapped
: 비동기 입출력을 위한 OVERLAPPED 구조체의 포인터이다. 파일을 FILE_FLAG_OVERLAPPED Flag로 열경우 반드시 이 구조체를 제공하여야 하며, 아닐 경우에는 NULL을 인수로 주면 된다.
- 파일로부터 데이퍼를 읽기.
- 주로 동기적인 입력에 사용하기 때문에 데이터를 완전히 읽기 전에는 리턴하지 않는다.
- 비동기 입력에 사용할 경우는 즉시 리턴한다.
- 파일 포인터 위치에서부터 데이터를 읽으며, 다 읽은 후에는 실제 읽은 바이트 수만큼 파일 포인터를 이동시켜 준다.
- 단, 비동기 입출력 중에는 직접 파일 포인터를 이동시켜 주어야한다.
* 함수 원형
BOOL ReadFile(
HANDLE hFile, ----①
LPVOID lpBuffer, ----②
DWORD nNumberOfBytesToRead, ------③
LPDWORD lpNumberOfBytesRead, -----④
LPOVERLAPPED lpOverlapped ------⑤ );
① hFile
: 데이터를 읽고자 하는 파일의 핸들이다. 이때는 파일을 열때 GENERIC_READ Flag로 열어야한다.
② lpBuffer
: 읽는 데이터를 저장할 버퍼의 포인터이다. 크기가 충분하여야 한다.
③ nNumberOfBytesToRead
: 읽고자 하는 바이트 수이다.
④ lpNumberOfBytesRead
: 실제로 읽은 바이트 수를 리턴받기 위한 충력용 인수이다. ReadFile가 호출되면 이 값을 0으로 만들며 비동기 입출력을 하지 않을 경우에는 이값을 NULL로 중 수 없으며 반드시 DWORD형 변수에 대한 포인터를 제공하여야 한다.
⑤ lpOverlapped
: 비동기 입출력을 위한 OVERLAPPED 구조체의 포인트이다. 파일을 열떄 Flag 값을 FILE_FLAG_OVERLAPPED로 열었다면 반드시 이 값을 제공 하여야 한다. 비동기를 사용하지 않는다면 NULL을 주면 된다.
* WriteFile()
- 파일에 데이터를 기록한다.
- 주로 동기적인 출력에 사용하지만 OVRELAPPED 구조체를 제공하묜 비동기 입출력을 비동기 입출력을 할 수 있다. 파일 포인터가 가리키고 있는 지점에 데이터를 기록하며 기록을 완료한 후 실제 기록한 바이트 수만큼 파일 포인터를 이동시켜준다. 단 비동기 입출력중일때는 파일 포인터를 직접이동시켜 주여야한다. 또한 파일 뿐만이 아니라 파이프 소켓 통신포트 콘솔 등의 장치에도 데이터를 출력 가능하다.
* 함수 원형
BOOL WriteFile(
HANDLE hFile, ----①
LPCVOID lpBuffer, ----②
DWORD nNumberOfBytesToWrite, ----③
LPDWORD lpNumberOfBytesWritten , ----④
LPOVERLAPPED lpOverlapped ----⑤ );
① hFile
: 데이터를 기록하고자 하는 파일의 핸들값을 입력한다. 이 핸들은 GENERIC_WRITE 엑세스 권한으로 열어야 한다.
② lpBuffer
: 출력할 데이터를 가진 버퍼이다.
③ nNumberOfBytesToWrite
: 기록할 바이트 수를 지정한다. 파이프로 네트웨크 전송을 할 때에는 65535바이트까지 기록할 수 있다.
④ lpNumberOfBytesWritten
: 실제로 기록한 바이트 수를 리턴받기 위한 출력용 인수이다. 함수 호출시에 이 값을 무조건 0으로 만든다. 비동기 입출력을 하지 않을경우에는 NULL을 인수로 줄 수 없으며 반드시 DWORD형 변수의 포인퍼를 제공하여야 한다.
⑤ lpOverlapped
: 비동기 입출력을 위한 OVERLAPPED 구조체의 포인터이다. 파일을 FILE_FLAG_OVERLAPPED Flag로 열경우 반드시 이 구조체를 제공하여야 하며, 아닐 경우에는 NULL을 인수로 주면 된다.
댓글
댓글 쓰기