※ 아래는 윤성우 뇌를 자극하는 윈도우즈 프로그래밍 한빛미디어(주) 2022년
Chapter18(p.585 ~ 631)를 읽고 정리한 내용입니다.
// 파일 열기
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); // 완전경로가 문자열로 버퍼에 저장된 이후,
// 버퍼의 특정 위치를 가리키는 포인터 값이 저장됨
// 디렉터리 생성
BOOL CreateDirectory(LPCTSTR lpPathName, // 생성하고자 하는 디렉터리 이름 지정
LPSECURITY_ATTRIBUTES lpSecurityAttributes); // 보안 속성 지정
// 디렉토리 소멸
BOOL RemoveDirectory(LPCTSTR lpPathName); // 소멸하고자 하는 디렉터리 이름 지정
초기에는 프로그램이 로드된 디렉터리(실행파일이 존재하는 디렉터리)로 설정되며, 이후 변경 가능
DWORD GetCurrentDirectory(DWORD nBufferLength, // 두 번째 인자로 전달된 버퍼의 길이 지정
LPTSTR lpBuffer); // 현재 디렉터리 정보를 저장할 버퍼의 주소값 지정
BOOL SetCurrentDirectory(LPCTSTR lpPathName); // 변경하고자 하는 현재 디렉터리 정보 지정
시스템 디렉터리 : 각종 라이브러리(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 하무를 통해서 얻은 핸들 반환