--------파일의 시간 정보 얻어오기

윈도우에서는 대표적으로 다음과 같은 정보를 얻을 수 있다.

1) 만든 날짜
2) 수정한 날짜(마지막으로)
3) 액세스한 날짜(마지막으로)


이를 위해 다음 함수를 사용한다.

bool GetFileTime(
 HANDLE hFile,
 LPFILETIME lpCreationTime,
 LPFILETIME lpLastAccessTime,
 LPFILETIME lpLastWriteTime
);

1) 시간 관련 정보를 얻을 대상 파일의 핸들을 지정한다
2) 파일이 생성된 시간을 얻기 위해 FILETIME 구조체 변수의
주소값을 전달하며, NULL을 전달하는 것도 가능하다.
3) 파일의 마지막 접근 시간을 얻기 위해 ~~
4) 파일의 마지막 데이터 갱신 시간(덮어쓰기 포함)을 얻기 위해 ~~~

FILETIME 구조체의 멤버들을 자세히 알려고 하는 것보단
다음 사실이 중요하다.

"FILETIME 구조체는 시간 정보를 나타내는 8바이트 자료형(DOWRD * 2)이다.
그리고 이 구조체는 UTC 기반으로 시간을 표현한다.

GetFileTime 함수는 UTC 기반으로 시간 정보를 돌려준다.

UTC 란, Coordinated Universal Time 의 간략한 표현으로, 세계 시간의 기준을
만들기 위해 정의된 시간이다. 간단히 설명하면,
세계 각 나라의 시간은 현재 제각각이며, 초 단위 아래로 내려가면 오차도 심하다.
그래서 나노초 단위의 높은 정밀도를 기준으로 세계 시간을 구성할 필요성이 대두되어
1601년 1월 1일을 기준으로 100 나노초 단위 기준으로 지나간 시간을 계산하는 것이다.
쉽게 말해 시,분,초는 생략하고, 지금이 2011년 8월 5일이라면,
현재의 UTC는 [2010-08-05] - [1601-01-01] 을 100나노초 단위로 환산한 값이 UTC가 된다.
이러한 UTC는 지금도 오차없이 유지되고 있으며, 정밀도를 최대한으로 높이기 위하여
높은 정밀도의 Atomic Clocks 라는 시계가 사용된다고 한다.
따라서 시간 정보를 얻을 경우 대부분 UTC 기반으로 얻게 되며,
문제는 우리가 원하는 것은 우리가 이해할 수 있는 스케일의 시간 정보라는 것이다.
이를 위해 우리가 원하는 타입으로 시간 정보를 변경하는 함수가 필요하며,
이를 다음 예제를 통해 우리가 이해할 수 있는 형태의 스케일로 변환하는 과정을 보여준다.

TCHAR fileName[] = _T("RealScaleViewer.exe");

TCHAR fileCreateTimeInfo[100];
TCHAR fileAccessTimeInfo[100];
TCHAR fileWriteTimeInfo[100];

FILETIME ftCreate, ftAccess, ftWrite;

SYSTEMTIME stCreateUTC, stCreateLocal;
SYSTEMTIME stAccessUTC, stAccessLocal;
SYSTEMTIME stWriteUTC, stWriteLocal;

HANDLE hFile = CreateFile(

 fileName, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATRRIBUTE_NORMAL, 0
);

//파일 시간 정보 추출
if( !GetFileTime(hFile, &ftCreate, &ftAccess,  &ftWrite))
{
 _tprintf(_T("GetFileTime Function call Fault!!\n"));
 return false;
}

//시간 정보 변환
FileTimeToSystemTime(&ftCreate, &stCreateUTC);
SystemTimeToTzSpecificLocalTime(
 NULL, &stCreateUTC, &stCreateLocal
);

~~ (Create대신 Access와 Write로 바꿔서 대입)

~~

_stprintf(
 fileCreateTimeInfo, _T("%02d / %02d / %d   %02d: %02d"),
 stCreateLocal.wMonth, stCreateLocal.wDay, stCreateLocal.wYear,
 stCreateLocal.wHour, stCreateLocal.wMinute
);

~~ (Create대신 Access와 Write로 바꿔서 대입)

+ Recent posts