파일 입출력
HANDLE CreateFile(
LPCTSTR lpFileName, // 파일이름 문자열 길이는 MAX_PATH 이하여야 한다.
DWORD dwDesiredAccess, // 파일의 엑세스 타입 ( GENERIC_READ, GENERIC_WRITE, GENERIC_READ|GENERIC_WRITE )
DWORD dwShareMode, // 공유 모드. 0이면 공유하지 않음. 하나만 쓰시오.
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // NULL
DWORD dwCreationDisposition, // 만들고자 하는 파일이 있거나 없을때의 처리
DWORD dwFlagsAndAttributes, // 속성과 옵션
HANDLE hTemplateFile // 만들고자 하는 파일의 추가 속성. 윈도95는 지원하지 않음. 그냥 NULL.
);
파일을 만들거나 연다. 실패의 경우 -1 ( INVALID_HANDLE_VALUE )이다.
dwShareMode
FILE_SHARE_DELETE NT에서만 사용 가능. 삭제 엑세스에서만 파일을 열 수 있다.
FILE_SHARE_READ 읽기 모드에서만 엑세스 가능
FILE_SHARE_WRITE 쓰기 모드에서만 엑세스 가능
dwCreateDisposition
CREATE_NEW 새로운 파일을 만들되 만약 지정한 파일이 있으면 만들지 않음
CREATE_ALWAYS 새로운 파일을 만들되 지정한 파일이 있으면 기존 파일을 삭제하고 다시 만듬
OPEN_EXISTING 기존에 존재하는 파일을 연다. 존재하지 않을 경우 삭제
OPEN_ALWAYS 기존에 존재하는 파일을 열되 존재하지 않으면 새로 만듬.
TRUNCATE_EXISTING 파일을 열고 파일 크기를 0으로 만든다. 이 플래그를 사용하기 위해서는 GENERIC_WRITE 모드로 파일을 열어야 한다.
dwFlagsAndAttributes
FILE_ATTRIBUTE_ARCHIVE 아카이브 속성
FILE_ATTRIBUTE_HIDDEN 숨은 파일
FILE_ATTRIBUTE_NORMAL 보통 파일. 이 플래그는 반드시 단일로 사용되어야 함
FILE_ATTRIBUTE_OFFLINE 연결되지 않은 저장 장치에 있어 즉시 사용할 수 없는 파일
FILE_ATTRIBUTE_READONLY 읽기 전용
FILE_ATTRIBUTE_SYSTEM 운영체제가 배타적으로 사용하는 파일
FILE_ATTRIBUTE_TEMPORARY 임시저장소에 저장되는 파일. 이 속성의 파일은 디스크에 저장되지 않고 메모리에 저장되므로 입출력 속도가 빠르다.
사용후에는 반드시 지워줘야 한다.
위의 속성과 함께 플래그를 OR연산을 사용해서 함께 사용할 수 있다.
FILE_FLAG_WRITE_THROUGH 데이터 출력시 캐시를 통해 곧바로 디스크에 출력한다. FLUSH속도가 빨라진다.
FILE_FLAG_OVERLAPPED 비동기 입출력을 행한다.
FILE_FLAG_NO_BUFFERING 버퍼나 캐시 없이 파일을 열도록 한다.
FILE_FLAG_RANDOM_ACCESS 임의 접근 파일임을 알린다.
FILE_FLAG_SEQUENTIAL_SCAN 순차 접근 파일임을 알린다. 위의 플래그와 함께 시스템에 캐시가 최적화 되는 도움을 준다. 이 플래그를 사용한다고
임의 접근이 불가능 한게 아니다.
FILE_FLAG_DELETE_ON_CLOSE 핸들이 닫힐 때 파일이 삭제되도록 한다.
FILE_FLAG_BACKUP_SEMANTICS POSIX 규칙대로 파일을 엑세스 한다. 이 플래그로 만들어진 파일은 DOS나 16비트 윈도우즈에서 읽혀질 수 없다.
FILE_FLAG_OPEN_REAPRSE_POINT NTFS의 reparse를 금지 시킨다.
FILE_FLAG_OPEN_NO_RECALL 원격 장치에 사용하는 플래그
BOOL CloseHandle(HANDLE hObject);
핸들을 닫는다.
BOOL WriteFile(
HANDLE hFile, // 파일 핸들
LPCVOID lpBuffer, // 버퍼
DWORD nNumberOfBytesToWrite, // 쓰고자 하는 바이트의 수
LPDWORD lpNumberOfBytesWrite, // 쓰여진 바이트의 수
LPOVERLAPPED lpOverlapped // 비동기를 위한 Overlapped 구조체
);
파일에 내용을 쓴다.
BOOL ReadFile(
HANDLE hFile, // 파일 핸들
LPVOID lpBuffer, // 버퍼
DWORD nNumberOfBytesToRead, // 읽을 바이트의 수
LPDWORD lpNumberOfBytesRead, // 읽어진 바이트의 수
LPOVERLAPPED lpOverlapped // 비동기를 위한 Overlapped 구조체
);
파일의 내용을 읽는다.
DWORD SetFilePointer(
HANDLE hFile, // 파일 핸들
LONG IDistanceToMove, // 파일 크기가 2G이하이면 이 인자의 범위내에서 이동이 가능하다. 밑의 인자를 NULL로 준다.
// 양수면 파일을 앞쪽(EOF를 향하여 가는 방향) 음수면 뒤쪽으로 읽는다.
PLONG lpDistanceToMoveHigh, // 위의 인자와 합쳐서 64비트 범위에서 이동 가능하다.
DWORD dwMoveMethod // 파일 포인터의 시작 위치를 지정한다.
);
파일 포인터의 위치를 변화 시킨다.
dwMoveMethod
FILE_BEGIN 파일의 시작 위치에서부터 FP를 이동 시킨다.
FILE_CURRENT 현재 위치에서 FP를 이동 시킨다.
FILE_END 파일의 끝에서부터 FP를 이동 시킨다.
비동기 입출력
우선 CreateFile에서 FILE_FLAG_OVERLAPPED플래그를 준다.
ReadFile, WriteFile함수를 사용할때 Overlapped구조체를 채운다.
typedef struct _OVERLAPPED {
ULONG_PTR Internal; // 내부적으로 사용
ULONG_PTR InternalHigh; // 내부적으로 사용
union {
struct {
DWORD Offset; // 하위 32비트.
DWORD OffsetHigh; // 상위 32비트. FP의 위치를 나타낸다.
};
PVOID Pointer;
};
HANDLE hEvent; // 비동기 입출력을 동기화 하기 위한 이벤트 오브젝트 객체이되 쓰지 않으면 NULL로.
} OVERLAPPED, *LPOVERLAPPED;
사용되는 OVERLAPPED 구조체의 실제 내용이다.
역시나 IOCP에서 사용했듯이 이 구조체를 사용하고 ReadFile, WriteFile을 하고난 다음 GeLastError()를 호출하면 ERROR_IO_PENDING이
리턴된다. 이것은 당연한 결과이다.-_-
BOOL GetOverlappedResult(
HANDLE hFile, // 파일 핸들
LPOVERLAPPED lpOvelapped, // Overlapped 구조체
LPDWORD lpNumberOfBytesTransferred, // 전송된 바이트의 수
BOOL bWait // 입출력 과정만 조사하고 바로 리턴할려면 FALSE, 입출력 완료시점까지 기다리려면 TRUE로 설정
);
입출력의 완료 시첨을 체크해 본다.
BOOL CancelIo(HANDLE hFile); // 파일 핸들
비동기 IO의 전송 중간에 취소한다.
파일 복사
BOOL CopyFile(
LPCTSTR lpExistingFileName, // 복사 대상 파일명
LPCTSTR lpNewFileName, // 새로 만들어질 파일명
BOOL bFailfExists // TRUE이고 기존파일이 존재하면 에러, FALSE이면 삭제하고 복사.
);
파일을 복사한다.
BOOL CopyFileEx(
LPCWSTR lpExistingFileName, // 복사 대상 파일명
LPCWSTR lpNewFileName, // 새로 만들어질 파일명
LPPROGRESS_ROUTINE lpProgressRoutine, // 콜백함수로 주기적으로 호출
LPVOID lpData, // 콜백함수 파라미터
LPBOOL pbCancel, // TRUE를 대입하면 복사 중지.
DWORD dwCopyFlags // 그냥 0으로. COPY_FILE_FAIL_IF_EXISTS 플래그의 경우 파일이 미리 존재하면 실패.
);
파일을 복사한다.
BOOL MoveFile(
LPCTSTR lpExistingFileName, // 옮길 대상 파일 이름
LPCTSTR lpNewFileName // 새로 옮겨질 파일 이름
);
파일 옮기기
BOOL MoveFileEx도 존재..
C Runtime 함수
int rename(const char *oldname, const char *newname);
파일이나 디렉토리도 이름 변경이 가능하다
다른 경로로 설정시 파일 옮기기 기능도 포함된다.
파일 정보 조사
DWORD GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh);
파일 크기 조사
DWORD GetFileAttributes(LPCTSTR lpFileName);
파일 속성 조사
C Runtime 함수
#include <io.h> 해줄것
int _access(
const char *path, // 조사할 파일 이름
int mode // 조사할 모드
);
mode에는
0이면 파일의 존재검사
2이면 읽기
4이면 쓰기
6이면 읽기쓰기
이 함수 성공시 0, 실패시 -1을 리턴
void _splitpath(const char *path, char *drive, char* dir, char *fname, char *ext);
경로 분리
디렉토리 관련
BOOL CreateDirectory(LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
디렉토리 생성
BOOL RemoveDirectory(LPCTSTR lpPathName);
디렉토리 지우기. 파일이나 서브디렉토리가 없어야 된다.
DWORD GetCurrentDirectory(DWORD nBufferLength, LPTSTR lpBuffer);
현재의 디렉토리경로를 버퍼에 설정
BOOL SetCurrentDirectory(LPCTSTR lpPathName);
현재 디렉토리 경로를 변경
UINT GetSystemDirectory(LPTSTR lpBuffer, UINT uSize);
시스템 디렉토리경로를 버퍼에 설정
UINT GetWindowsDirectory(LPTSTR lpBuffer, UINT uSize);
윈도우즈 설치 경로를 버퍼에 설정
디스크 정보 관리
UINT GetDriveType(LPCTSTR lpRootPathName);
RootPathName에는 대상 디스크의 루트 디렉토리를 지정하는 문자열을 준다. 인자가 NULL이면 현재 디렉토리의 루트 디렉토리가 사용된다.
리턴값 설명
DRIVE_UNKNOWN 알수 없는 타입이다.
DRIVE_NO_ROOT_DIR 루트 디렉토리가 없다.
DRIVE_NOMOVABLE 이동식 디스크. 플로피 디스크가 이에 속한다.
DRIVE_FIXED 고정된 디스크이며 일반적으로 하드 디스크를 의미한다.
DRIVE_REMOTE 네트웍으로 연결된 드라이브이다.
DRIVE_CDROM CD-ROM드라이브이다.
DRIVE_RAMDISK 램 디스크이다.
BOOL GetDiskFreeSpaceEx(
LPCTSTR lpDirectoryName, // 조사 대상 디스크의 디렉토리
PULARGE_INTEGER lpFreeBytesAvailableToCaller, // 사용 가능량 ( 현재 사용자의 사용가능한 용량 )
PULARGE_INTEGER lpTotalNumberOfBytes, // 총 용량
PULARGE_INTEGER lpTotalNumberOfFreeBytes // 디스크의 사용가능한 용량 ( 물리적 디스크의 남은 용량 ). NULL설정 가능하다.
);
typedef union _ULARGE_INTEGER {
struct {
DWORD LowPart;
DWORD HighPart;
};
ULONGLONG QuadPart;
} ULARGE_INTEGER; // 그냥 64비트수 이다.
BOOL SetVolumeLabel(LPCTSTR lpRootPathName, LPCTSTR lpVolumeName);
디스크의 이름을 설정한다.
BOOL GetVolumeInformation(
LPCTSTR lpRootPathName, // 루트 경로의 이름
LPTSTR lpVolumeNameBuffer, // 불륨의 이름
DWORD nVolumeNameSize, // 불륨의 이름의 길이
LPDWORD lpVolumeSerialNumber, // 물리적 고유 번호
LPDWORD lpMaximumComponentLength, // 최대 파일명의 길이. 최대 255
LPDWORD lpFileSystemFlags, // 파일 시스템 플래그
LPTSTR lpFIleSystemNameBuffer, // 파일 시스템 버퍼
DWORD nFileSystemNameSize // 파일 시스템 문자열 버퍼의 길이
);
lpFileSystemFlags
FS_CASE_IS_PRESERVED 파일의 대소문자를 구분해서 저장한다. 사용자의 입력대로 저장한다.
FS_CASE_SENSITIVE 파일이름의 대소문자를 구분한다.
FS_UNICODE_STORED_ON_DISK 파일이름이 유니코드를 지원한다.
FS_PERSISTENT_ACLS 파일시스템에 ACL을 보존한다.
FS_FILE_COMPRESSION 파일단위의 압축을 지원한다.
FS_VOL_IS_COMPRESSION 더블 스페이스 등을 압축된 볼륨이다.
FILE_SUPPROTS_ENCRYPTION 파일 암호화를 지원한다.
FILE_SUPPORTS_OBEJCT_IDS 오브젝트 ID를 지원한다.
FILE_SUPPORTS_REPARSE_POINT reparse point를 지원한다.
FILE_SUPPORTS_SPARSE_FILES sparse file을 지원한다.
FILE_VOLUME_QUOTAS 디스크 할당을 지원한다.