본문 바로가기

My Study/Function

GetFileTime, FileTimeToSystemTime, SystemTimeToTzSpecificLocalTime

BOOL WINAPI GetFileTime(
  __in       HANDLE hFile,
  __out_opt  LPFILETIME lpCreationTime,
  __out_opt  LPFILETIME lpLastAccessTime,
  __out_opt  LPFILETIME lpLastWriteTime
);
프로그램 상에서 만든 날짜, 수정한 날짜, 액세스한 날짜 같은 정보를 얻기 위해, 혹은 변경하기 위해서 사용하는 함수

hFile : 시간 관련 정보를 얻을 대상 파일의 핸들을 지정한다.
lpCreationTime : 파일이 생성된 시간을 얻기 위해 FILETIME구조체 변수의 주소값을 전달한다. NULL을 전달하는 것도 가능
lpLastAccessTime : 파일의 마지막 접근 시간을 얻기 위해 FILETIME구조체 변수의 주소값을 전달한다. 
                             NULL을 전달하는 것도 가능
lpLastWriteTime : 파일이 마지막 데이터 갱신 시간을 얻기 위해 FILETIME구조체 변수의 주소값을 전달한다. 
                          NULL을 전달하는 것도 가능

실패 시 0 리턴.. 성공 하면 0 아님..~

typedef struct _FILETIME {
  DWORD dwLowDateTime;
  DWORD dwHighDateTime;
} FILETIME, *PFILETIME;

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

UTC : Coordinated Universal Time"의 약자. 세계 시간의 기준을 만들기 위해 정의된 시간.
현재 세계 각 나라의 시간은 제각각이며, 초단위 아래로 내려가면 오차도 심하다. 이러한 기준으로는 과학적 연구를 포함한 글로벌틱한 연구를 진행하기가 어렵다.
그래서 나노초단위의 높은 정밀도를 기준으로 세계 시간을 구성했다.
이것은 1601년 1월 1일을 기준으로 100나노초 단위 기준으로 지나간 시간을 계산하는 것이다. 쉽게 말해서 시,분,초는 생략하고, 
지금이 2007년 1월 1일 이라면 현재의 UTC는 [2007,01,01] - [1601,01,01]을 100나노초 단위로 환산한 값이 UTC가 된다.
컴퓨터 분야도 상당히 정확한 시간을 요구하는 분야이므로 시간 정보를 얻을 경우 대부분 UTC기반으로 얻게 된다.

이러한 UTC시간은 나노초이며 세계 시간 표준이다. 그래서 이것을 보기쉽게 시분초로 나타내며 한국시간으로 나타내는 소스코드를 예제로 보여주겠다.
그 전에 몇가지 함수를 더 소개

BOOL WINAPI FileTimeToSystemTime(
  __in   const FILETIME *lpFileTime,
  __out  LPSYSTEMTIME lpSystemTime
);
나노초로 표시된 것을 년,월,일,시,분,초 등등으로 나눠서 SYSTEMTIME구조체 변수에 저장해 줌(하지만 세계표준시..)
lpFileTime : 파일 시간의 정보
lpSystemTime : SYSTEMTIME구조체의 변수

typedef struct _SYSTEMTIME {
  WORD wYear; //년
  WORD wMonth; //월
  WORD wDayOfWeek; //몇번째 주 인가
  WORD wDay; //일
  WORD wHour; //시
  WORD wMinute; //분
  WORD wSecond; //초
  WORD wMilliseconds; //밀리 초
} SYSTEMTIME, *PSYSTEMTIME;

BOOL WINAPI SystemTimeToTzSpecificLocalTime(
  __in_opt  LPTIME_ZONE_INFORMATION lpTimeZone,
  __in      LPSYSTEMTIME lpUniversalTime,
  __out     LPSYSTEMTIME lpLocalTime
);
세계표준시를 내 컴퓨터 시스템에 맞게 변경 해줌.. 
lpTimeZone : 변경하고자 하는 시간대에 대한 정보, NULL이 전달되면 현재 시스템의 시간대 정보가 기준이 된다.
lpUniversalTime : 변경할 대상이 되는 UTC기반 시간 정보
lpLocalTime : 변환된 시간 정보가 채워질 변수의 주소값

소스코드
#include <stdio.h>
#include <Windows.h>
#include <tchar.h>

int _tmain(int argc, TCHAR* args[])
{
TCHAR fileName[] = _T("data.txt");
TCHAR fileCreateTimeInfo[100];

FILETIME ftCreate, ftAccess, ftWrite;

SYSTEMTIME stCreateUTC, stCreateLocal;

HANDLE hFile = CreateFile(fileName,GENERIC_READ,NULL,NULL,
                                                  OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); //해당 파일로부터 핸들 얻어옴
if(hFile == INVALID_HANDLE_VALUE)
{
_tprintf(_T("Failed create file \n"));
return -1;
}

//그 파일의 생성날짜, 접근날짜, 수정날짜를 UTC 나노초 단위로 읽어옴
if(!(GetFileTime(hFile,&ftCreate,&ftAccess,&ftWrite)))
{
_tprintf(_T("Failed get the time! \n"));
return -1;
}

//나노초 시간을 보기 쉽게 년,월,일,시,분,초 등등으로 나눠 줌
FileTimeToSystemTime(&ftCreate,&stCreateUTC);  
//UTC시간을 내 컴퓨터 시스템 시간으로 바꿔 줌
SystemTimeToTzSpecificLocalTime(NULL,&stCreateUTC,&stCreateLocal);
//배열에 저장..
_stprintf(fileCreateTimeInfo,_T("%-2d/%-2d/%-6d%-4d%-4d%-4d"),stCreateLocal.wYear,stCreateLocal.wMonth
,stCreateLocal.wDay,stCreateLocal.wHour,stCreateLocal.wMinute,stCreateLocal.wSecond);
_fputts(fileCreateTimeInfo,stdout);

CloseHandle(hFile);

return 0;
}

'My Study > Function' 카테고리의 다른 글

GetFileAttributes  (0) 2010.02.25
GetFileSize  (0) 2010.02.25
RaiseException  (0) 2010.02.25
GetExceptionCode  (0) 2010.02.25
SetEvent  (0) 2010.02.25