728x90

파일의 특성(Attribute) 정보 얻어오기

파일의 특성정보는 파일의 속성에서 확인할 수 있다.

파일의 특성 정보는 읽기전용, 숨김, 보관 등에 대한 정보이다. 이러한 특성 정보는 프로그램 코드 상에서도 변경 및 확인이 가능하다.

 

특성 정보 확인 함수

DWORD GetFileAttributes(

   LPCTSTR lpFileName

);

lpFileName : 특성 정보를 얻고자 하는 파일의 이름을 지정한다. 파일의 특성정보는 반환값을 통해서 얻게된다.

 

위 함수를 통해 파일 특성에 대한 정보들을 얻을 수 있다. 

 

파일 특성 정보의 표현 방식

위 그림은 32비트 자료형 DWORD을 보여주고 있다.

첫번째 비트가 1인 경우의 값 0x00000001을 "읽기 전용 특성"정보를 표현하는데 사용하기로 정의되어 있다.

 

두번째 인덱스 비트가 1인 경우에 해당하는 값 0x00000002는 "숨김 특성" 정보를 표현하는데 사용하기로 정의되어 있다.

 

위 두가지 특성정보 외에도 파일이 가질 수 있는 특성정보의 종류는 12가지정도가 더 된다.

 

따라서 반환값이 인덱스 기준으로 0번째 비트와 1번째 비트가 각각 1로 설정되어 있으면, 그 파일은 읽기 전용이자 숨김 특성까지 지닌 파일이 된다.

프로그램 구현의 용이성을 위해서 읽기 전용특성과 숨김 특성을 다음과 같이 매크로 상수로 정의해 놓고 있다.

#define FILE_ATTRIBUTE_READONLY 0x00000001

#define FILE_ATTRIBUTE_HIDDEN 0x00000002

 

파일 특성 정보 변경 함수

BOOL SetFileAttributes(

  LPCTSTR lpFileName,

  DWORD dwFileAttributes

);

1.lpFileName : 특성 정보를 변경하고픈 파일의 이름을 지정한다.

2.dwFileAttributes : 변경할 특성 정보를 전달한다.

 

GetFileAttributes함수와 SetFileAttributes 함수는 일반적인 파일 처리 함수와 차이를 보인다. 그것은 핸들을 필요로 하지 않는다는 점이다. 대신 위치 경로를 포함하는 파일의 이름을 필요로 한다.

 

 

파일의 특성(Attribute) 정보 핸들로부터 얻어오기 + α

BOOL GetFileInformationByHandle(

  HANDLE hFile,

  LPBY_HANDLE_FILE_INFORMATION lpFileInformation

);

1.hFile : 정보를 얻고자 하는 파일의 핸들을 지정한다.

2.LPBY_HANDLE_FILE_INFORMATION : 구조체 BY_HANDLE_FILE_INFORMATION의 포인터 타입이다. 여기로 전달되는 주소의 변수에 파일 정보가 채워진다.

 

GetFileInformationByHandle 함수를 통해서 얻는 정보는 파일의 시간 정보, 파일의 크기정보, 파이르이 시스템 정보들을 얻을 수 있다.

BY_HANDLE_FILE_INFORMATION 선언

typedef struct _BY_HANDLE_FILE_INFORMATION

{

   DWORD dwFileAttributes;

   FILETIME ftCreationTime;

   FILETIME ftLastAccessTime;

   FILETIME ftLastWriteTime;

   DWORD dwVolumeSerialNumber;

   DWORD nFileSizeHigh;

   DWORD nFileSizeLow;

   DWORD nNumberOfLinks;

   DWORD nFileIndexHigh;

   DWORD nFileIndexLow;

}BY_HANDLE_FILE_INFORMATION, *BYHANDLE_FILE_INFORMATION;

 

GetFileInformationByHandle 함수를 이용하여 파일에 대한 정보를 가져와 각 멤버에 접근하여 관련정보를 알 수 있다.

 

파일의 경로(Path)정보 얻어오기

DWORD GetFullPathName(

  LPCTSTR lpFileName,

  DWORD nBufferLenth,

  LPTSTR lpBuffer,

  LPTSTR* lpFilePart

);

1.lpFileName : 완전 경로(Full Path)를 확인하고자 하는 파일 이름 전달.

2.nBufferLength : 완전 경로를 저장할 버퍼에 저장 가능한 문자열 길이를 지정한다. 버퍼의 바이트 단위 크기가 아니라 저장가능한 문자열의 길이이다.

3.lpBuffer : 완전 경로를 저장할 버퍼의 주소값을 지정한다.

4.lpFilePart : 완전 경로가 문자열로 버퍼에 저장된 이후, 버퍼의 특정 위치를 가리키는 포인터 값이 저장된다. 마지막 역 슬래쉬(\)다음 번지 주소값이 저장된다.

 

파일 포인터의 이동

ANSI표준함수 fseek에 해당하는 windows 시스템 함수는 SetFilePointer이다.

 

DWORD SetFilePointer(

   HANDLE hFile,

   LONG lDistanceToMove,

   PLONG lpDistanceToMoveHigh,

   DWORD dwMoveMethod

);

1.hFile : 파일 포인터 위치를 이동시킬 대상 파일의 핸들을 지정한다.

2.lDistanceToMove : 이동시킬 거리를 지정한다. 만약에 64비트 기반으로 구현한다면, 하위 4바이트 정보를 표현하게 된다.

3.lDistatnceToMoveHigh : 64비트 기반의 대용량 파일에서만 의미를 지닌다. 상위 4바이트 정보를 표현하게 된다. 32비트 기반에서는 NULL을 전달한다.

4.dwMoveMethod : 파일 포인터 이동시 기준이 되는 위치를 지정한다.

파이르이 가장 앞부분을 기준으로 설정하고자 할 때에는 FILE_BEGIN을 인자로 전달한다. fseek 함수의 SEEK_SET에 해당한다. SEEK_CUR과 같은 의미로는 FILE_CURRENT, SEEK_END와 같은 의미로는 FILE_END를 인자로 전달한다.

 

SetFilePointer함수를 이용하여 파일 포인터 이동 후 ReadFile함수를 이용하여 파일을 읽어들이면 설정한 파일 포인터 부터 읽어들인다.

 

32비트 기반의 파일에서는 3번째 인자에 NULL을 전달하고, 64비트 기반의 대용량 파일에서는 상위 4바이트 정보를 받을 변수의 주소 값을 인자로 넣어준다.

 

 

728x90

+ Recent posts