[Chapter 18] 파일 I/O와 디렉터리 컨트롤

·2022년 11월 6일

※ 아래는 윤성우 뇌를 자극하는 윈도우즈 프로그래밍 한빛미디어(주) 2022년
Chapter18(p.585 ~ 631)를 읽고 정리한 내용입니다.

01 기본적인 파일 처리 함수들

// 파일 열기
HANDLE CreateFile(LPCTSTR lpFileName, // 개방할 파일 이름 지정
				  DWORD dwDesiredAccess, // 읽기/쓰기 모드 지정(or 연산으로 결합 가능)
                  						// GENERIC_READ : 읽기 모드 지정
                                        // GENERIC_WRITE : 쓰기 모드 지정
                  DWORD dwShareMode, // 파일 공유방식 지정
                  					 // 0 : 다른 프로세스에 절대 공유 불가
                                     //이미 개방된 파일은 중복 개방 불가
                                     // FILE_SHARE_READ : 다른 프로세스에서
                                     //이 파일에 동시 읽기 접근 가능
                                     // FILE_SHARE_WRITE : 다른 프로세스에서
                                     //이 파일에 동시 쓰기 접근 가능
                                     //(단, 동시에 같은 영역에 데이터 쓰는 문제를
                                     // 피해야 함)
                  LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 보안 속성 지정
                  											 // 디폴트 : NULL
                  DWORD dwCreationDisposition, // 파일 생성 방법 지정
                  							   // CREATE_ALWAYS 항상 새 파일 생성
                                               // CREATE_NEW : 새파일 생성
                                               // (같은 이름의 파일이 존재하면 실패)
                                               // OPEN_ALWAYS 기존 파일 개방
                                               // 없으면 새로 생성
                                               // OPEN_EXISTING 기존 파일 개방
                                               // 없으면 함수 호출 실패
                                               // TRUNCATE_EXISTING 기존 파일의 내용 지우고 개방
                                               // 없으면 호출 실패
                  DWORD dwFlagsAndAttributes, // 파일 특성 정보 설정
                  							  // 기본적으로 FILE_ATTRIBUTES_NORMAL 사용
                  HANDLE hTemplateFile); // 기존에 존재하는 파일과 동일한 특성을
                  						 // 가지는 새 파일을 만들 때 사용되는 전달 인자
                                         // Windows ME/98/95에서는 이 전달인자를
                                         // 지원하지 않기 때문에 보통 NULL 전달함
// 함수 호출이 성공하면, 파일의 핸들이 반환됨
// 파일 읽기
BOOL ReadFile(HANDLE hFile, // 데이터를 읽을 파일의 핸들 지정
			  LPVOID lpBuffer, // 읽어 들인 데이터를 저장할 버퍼(배열, 메모리)의 주소(포인터) 지정
              DWORD nNumberOfBytesToRead, // 파일로부터 읽고자 하는 데이터의 크기를 바이트 단위로 지정
              LPDWORD lpNumberOfBytesdRead, // 실제 읽어 들인 데이터 크기를 얻기 위한 변수의 주소를 지정
              LPOVERLAPPED lpOverlapped);
// 파일 쓰기
BOOL WriteFile(HANDLE lpBuffer, // 데이터를 저장할 파일의 핸들 지정
			   LPCVOID lpBuffer, // 데이터를 저장하고 있는 버퍼(배열, 메모리)의 주소(포인터) 지정
               DWORD nNumberOfBytesToWrite, // 파일에 저장하고자 하는 데이터 크리를 바이트 단위로 지정
               LPDWORD lpNumberOfBytesWritten, // 파일에 실제 저장된 데이터 크기를 얻기 위해 변수의 주소 지정
               LPOVERLAPPED lpOverlapped);
// 파일 시간 정보 얻어오기
BOOL GetFileTime(HANDLE hFile, // 시간 관련 정보를 얻을 대상 파일의 핸들 지정
			     LPFILETIME lpCreationTime, // 파일이 생성된 시간을 얻기 위한 주소값 전달(NULL 전달 가능)
                 LPFILETIME lpLastAccessTime, // 파일의 마지막 접근 시간을 얻기 위한 주소값 전달(NULL 전달 가능)
                 LPFILETIME lpLastWriteTime); // 파일의 마지막 데이터 갱신 시간을 얻기 위한 주소값 전달(NULL 전달 가능)

// 위 함수의 2~4번째 인자는 FILETIME 구조체 변수의 포인터임
// FILETIME 구조체는 시간 정보를 나타내는 8바이트 자료형(DWORD * 2)
// 이 구조체는 UTC 기반으로 시간을 표현함
typedef struct _FILETIME(
DWORD dwLowDateTime;
DWORD dwHighDateTime;
) FILETIME, * PFILETIME;
// 파일 사이즈 얻어오기
DWORD GetFileSize(HANDLE hFile, // 파일 핸들 지정, 이 핸들이 가리키는 파일의 크기 정보를 얻게 됨
				  LPDWORD lpFileSizeHigh);
// 4G바이트 이상의 파일에 대해서 상위 4바이트와 하위 4바이트를 각각 다른 경로를
// 통해서 얻어야 함

BOOL GetFileSizeEx(HANDLE hFile, // 크기를 얻고자 하는 파일의 핸들 지정
				   PLARGE_INTEGER lpFileSize); // 파일 크기를 저장하기 위한 변수의 포인터(주소값)을 인자로 전달
     										   // 8바이트 자료형 
// 파일 특성 정보 불러오기
DWORD GetFileAttributes(LPCTSTR lpFileName); // 특성 정보를 얻고자 하는 파일의 핸들 지정
// 파일의 특성 정보는 반환값을 통해서 얻게 됨
// 파일 특성 정보 설정하기
BOOL SetFileAttributes(LPCTSTR lpFileName, // 특성 정보를 변경하고픈 파일의 핸들 지정
					   DWORD dwFileAttributes); // 변경할 특성 정보 전달
// 파일의 특성 정보 핸들로부터 얻어오기
BOOL GetFileInformationByHandle(HANDLE hFile, // 정보를 얻고자 하는 파일의 핸들 지정
								LPBY_HANDLE_FILE_INFORMAION lpFileInformation);
                                // 구조체의 포인터 타입, 여기로 전달되는 주소의 변수에 파일 정보가 채워짐               
// 파일 경로 정보 얻어오기
DWORD GetFullPathName(LPCTSTR lpFileName, // 완전 경로를 확인하고자 하는 파일 이름 전달
					  DWORD nBufferLength, // 완전 경로를 저장할 버퍼에 저장 가능한 문자열 길이 지정
                      					   // 버퍼의 바이트 단위 크기가 아니라 저장 가능한 문자열 길이
                      LPTSTR lpBuffer, // 완전경로를 저장할 버퍼의 주소값 지정
                      LPTSTR* lpFilePart); // 완전경로가 문자열로 버퍼에 저장된 이후,
                      					   // 버퍼의 특정 위치를 가리키는 포인터 값이 저장됨

02 디렉터리 관련 함수 및 그밖의 함수들

// 디렉터리 생성
BOOL CreateDirectory(LPCTSTR lpPathName, // 생성하고자 하는 디렉터리 이름 지정
					 LPSECURITY_ATTRIBUTES lpSecurityAttributes); // 보안 속성 지정
                     
// 디렉토리 소멸
BOOL RemoveDirectory(LPCTSTR lpPathName); // 소멸하고자 하는 디렉터리 이름 지정

현재 디렉터리

초기에는 프로그램이 로드된 디렉터리(실행파일이 존재하는 디렉터리)로 설정되며, 이후 변경 가능

DWORD GetCurrentDirectory(DWORD nBufferLength, // 두 번째 인자로 전달된 버퍼의 길이 지정
						  LPTSTR lpBuffer); // 현재 디렉터리 정보를 저장할 버퍼의 주소값 지정
                          
BOOL SetCurrentDirectory(LPCTSTR lpPathName); // 변경하고자 하는 현재 디렉터리 정보 지정

시스템 디렉터리 & Windows 디렉터리

시스템 디렉터리 : 각종 라이브러리(DLL) 및 드라이버 파일처럼 Windows 시스템에 중요한 파일들이 존재하는 위치
Windows 디렉터리 : 초기화 및 실행파일들이 존재하는 위치

-> 두 디렉터리는 현재 디렉터리와 달리 변경하면 안된다.

// 시스템 디렉터리 위치 정보 확인 함수
UINT GetSystemDirectory(LPTSTR lpBuffer, // 시스템 디렉터리 정보를 저장할 버퍼의 주소값 지정
						UINT uSize); // 첫 번째 인자로 전달된 버퍼의 길이 지정
                        
// Windows 디렉터리 위치 정보 확인 함수
UINT GetWindowsDirectory(LPTSTR lpBUffer, // Windows 디렉터리 정보를 저장할 버퍼의 주소값 지정
						 UINT uSize); // 첫 번째 인자로 전달된 버퍼의 길이 지정

디렉터리에서 파일 찾기

DWORD SearchPath(LPCTSTR lpPath, // 대상 경로 지정
// NULL이 전달되면 표준검색경로대로 파일을 찾게 된다.
// (1) 실행 중인 프로그램이 로드된 디렉터리(실행파일이 존재하는 디렉터리)
// (2) 현재 디렉터리
// (3) 시스템 디렉터리
// (4) Windows 디렉터리
// (5) 마지막으로 환경변수 PATH에 등록된 디렉터리들
				 LPCTSTR lpFileName, // 찾고자 하는 파일 이름
                 LPCTSTR lpExtensioon, // 확장자를 지정하는 인자
                 					   // 확장자를 지정해 줄 필요가 없을 때는 NULL 지정
                 DWORD nBufferLength, // 완전경로명을 저장할 버퍼의 길이 지정
                 LPTSTR lpBuffer, // 완전경로명을 저장할 버퍼의 주소 지정
                 LPTSTR* lpFilePart); // 함수 호출 결과로 얻게 되는 완전경로명의 마지막에는
                 					  // 파일 이름도 추가된다.
                                      // 이 전달인자를 통해서 파일 이름이 저장된 위치 정보를 얻게 된다.
HANDLE FindFirstFile(LPCTSTR lpFileName, // 파일이나 디렉터리 이름 지정
					 LPWIN32_FIND_DATA lpFindFileData); // 발견된 파일이나 디렉터리 정보를 담은 구조체 변수의 주소값 전달
                     
BOOL FindNextFile(HANDLE hFindFile, // FindFirstFile 함수 호출을 통해 얻은 핸들 전달
				  LPWIN32_FIND_DATA lpFindFileData); // 발견된 파일이나 디렉터리 정보를 담을
                  									 // 구조체 변수의 주소값 전달

BOOL FindClose(HANDLE hFindFile); // FindFirstFile 하무를 통해서 얻은 핸들 반환

0개의 댓글