CodeSarang.Com
Home | All categories Join | Login | 검색   

 

파일 입출력의 모든것

등록자 : rawmania (김정수), 2008-09-05
글수정 | 글삭제


  1. 파일 입출력
  2. 파일 복사
  3. 파일 삭제
  4. 파일 정보 조사
  5. 디렉토리 관련
  6. 디스크 정보 관리
  7. 파일 검색

파일 입출력

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); 
파일이나 디렉토리도 이름 변경이 가능하다 
다른 경로로 설정시 파일 옮기기 기능도 포함된다.  

파일 삭제

BOOL DeleteFile(LPCTSTR lpFileName);   // 파일 이름 
파일을 삭제한다. 

파일 정보 조사

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                디스크 할당을 지원한다. 

파일 검색

HANDLE FindFirstFile( 
     LPCTSTR lpFileName,                  // 검색할 파일명 (와일드 카드식 사용가능) 
     LPWIN32_FIND_DATA lpFindFileData     // 파일명및 생성, 수정시간, 크기, 속성 등의 정보가 들어 오는 구조체 
); 
 
BOOL FindNextFile( 
     HANDLE hFindFile,                    // FindFirstFile함수 검색 핸들(search handle) 
     LPWIN32_FIND_DATA lpFindData         // 다음 검색 결과가 들어오는 구조체 
); 
 
BOOL FindClose(HANDLE hFindFile);         // 검색 핸들을 닫아줌 
 
한 디렉토리에 있는 파일들만 검색된다. 재귀적으로 사용하려면 검색 결과 WIN32_FIND_DATA구조체의 dwFileAttributes멤버에  
FILE_ATTRIBUTE_DIRECTORY와 같으면 서브디렉토리인데 그 서브디렉토리도 들어가서 재귀적으로 검색해 줘야 한다. 




글수정 | 글삭제
http://codesarang.com. mail to cpueblocpueblo.com