Vienna

Chapter 18) 파일 I/O와 디렉터리 컨트롤 - 파일 열기/닫기/읽기/쓰기 본문

그외/뇌를 자극하는 윈도우즈 시스템 프로그래밍

Chapter 18) 파일 I/O와 디렉터리 컨트롤 - 파일 열기/닫기/읽기/쓰기

아는개발자 2023. 4. 17. 12:54

책에서 권장하는 대로 18장의 CraeteFile/ReadFile/WriteFile 함수를 먼저 배우기로 했다.

 

◇ 파일 열기 & 닫기

HANDLE CreateFile(
	LPCTSTR lpFileName,	// 1
    DWORD dwDesiredAccess,	//2
    DWORD dwShareMode,	//3
    LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 4
    DWORD dwCreationDisposition,	// 5
    DWORD dwFlagsAndAttributes,	//6
    HANDLE hTemplateFile	// 7
);

// If the function filas, the return valus is INVALID_HANDLE_VALUE. // 8
lpFileName Open할 파일 이름 지정
dwDesiredAccess 읽기/쓰기 모드 지정
GENERIC_READ 읽기 모드 지정
GENERIC_WRITE 쓰기 모드 지정
dwShareMode 파일 공유방식을 지정
0 다른 프로세스에 절대 공유 불가! 중복 개방 불가.
FILE_SHARE_READ 다른 프로세스에서 이 파일에 동시 읽기 접근 가능.
FILE_SHARE_WRITE 다른 프로세스에서 이 파일에 동시 쓰기 접근 가능.
lpSecurityAttributes 보안 속성을 지정
dwCreationDisposition 파일이 생성되는 방법을 지정
CREATE_ALWAYS 항상 새 파일 생성
CREATE_NEW 새 파일 생성. 같은 이름의 파일이 존재하면 생성 실패!
OPEN_ALWAYS 기존 파일 개방. 없으면 새로 생성
OPEN_EXISTING 기존 파일 개방. 존재하지 않으면 함수 호출 실패!
TRUNCATE_EXISTING 기존 파일의 내용 지우고 개방. 파일이 존재하지 않으면 호출 실패!
dwFlagsAndAttributes 파일의 특성 정보를 설정.
hTemplateFile 기존에 존재하는 파일과 동일한 특성을 가지는 새 파일을 만들 때 사용되는 전달 인자

 

◇ 파일 읽기 & 쓰기와 포인터

BOOL ReadFile(
	HANDLE hFile,	// 1
    LPVOID lpBuffer,	// 2
    DWORD nNumberOfBytesToRead,	// 3
    LPDWORD lpNumberOfBytesRead,	//4
    LPOVERLAPPED lpOverlapped	//5
);

// If the function filas the return value is 0
hFile 데이터를 읽을 파일의 핸들을 지정
lpBuffer 읽어 들인 데이터를 저장할 버퍼의 주소를 지정
nNumberOfBytesToRead 파일로부터 읽고자하는 데이터의 크기를 바이트 단위로 지정
lpNumebrOfBytesRead 실제 읽어 들인 데이터 크기를 얻기 위한 변수의 주소를 지정
lpOverlapped  
BOOL WrtieFile(
	HANDLE hFile,	// 1
    LPCVOID lpBuffer,	// 2
    DWORD nNumberOfBytesToWrite,	// 3
    LPDWORD lpNumberOfBytesWritten,	// 4
    LPOVERLAPPED lpOverlapped	// 5
);

// If the function fails, the return value is zero.
hFile 데이터를 저장할 파일의 핸들을 지정
lpBuffer 데이터를 저장하고 있는 버퍼의 주소를 지정
nNumberOfBytesToRead 파일에 저장하고자 하는 데이터 크기를 바이트 단위로 지정
lpNumebrOfBytesRead 파일에 실제 저장된 데이터 크기를 얻기 위해 변수의 주소를 지정
lpOverlapped  
/*
* UNICODE_BASE_FILE_IO.cpp
* 
* 프로그램 설명: 유니코드 기반의 파일 출력
*/

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

int _tmain(int argc, TCHAR* argv[])
{
	TCHAR fileName[] = _T("data.txt");
	TCHAR fileData[] = _T("Just test string~");

	HANDLE hFile = CreateFile(fileName, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
	if (hFile == INVALID_HANDLE_VALUE) {
		_tprintf(_T("File creation fault!"));
		return -1;
	}

	DWORD numOfBytesWritten = 0;
	WriteFile(hFile, fileData, sizeof(fileData), &numOfBytesWritten);
	CloseHandle(hFile);

	return 0;
}

실행 결과

/*
* UNICODE_BASE_FILE_READ.cpp
*
* 프로그램 설명: 유니코드 기반의 파일 입력
*/

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

#define STRING_LEN 100

int _tmain(int argc, TCHAR* argv[])
{
	TCHAR fileName[] = _T("data.txt");
	TCHAR fileData[STRING_LEN];

	HANDLE hFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
	if (hFile == INVALID_HANDLE_VALUE) {
		_tprintf(_T("File open fault!\n"));
		return -1;
	}

	DWORD numOfByteRead = 0;
	ReadFile(hFile, fileData, sizeof(fileData), &numOfByteRead, NULL);

	fileData[numOfByteRead / sizeof(TCHAR)] = 0;

	_tprintf(_T("Read data size: %u\n"), numOfByteRead);
	_tprintf(_T("Read string: %s\n"), fileData);

	CloseHandle(hFile);

	return 0;
}

실행 결과

Comments