MFC에서 파일의 생성 시간(Creation Time), 접근 시간(Last Access Time), 쓰기 시간(Last Write Time)을 확인하는 방법입니다.
여기서 사용하는 핵심 함수는 크게 3가지 입니다.
/**
파일의 시간을 받아오는 함수
@param hFile 시간을 받아올 파일 핸들
@param lpCreationTime 파일의 생성시간을 반환할 포인터 (NULL인경우 반환 안함)
@param lpLastAccessTime 파일의 마지막 접근 시간을 반환할 포인터 (NULL인경우 반환 안함)
@param lpLastWriteTime 파일의 마지막 쓰기 시간을 반환할 포인터 (NULL인경우 반환 안함)
*/
BOOL GetFileTime(
[in] HANDLE hFile,
[out, optional] LPFILETIME lpCreationTime,
[out, optional] LPFILETIME lpLastAccessTime,
[out, optional] LPFILETIME lpLastWriteTime
);
먼저 GetFileTime
입니다.
파일의 시간을 받아오는 함수입니다.
이때 반환되어진 시간은 FILETIME
값입니다.
/**
File Time(FILETIME)을 System Time(SYSTEMTIME)으로 변환하는 함수
@param lpFileTime 변환할 FileTime
@param lpSystemTime 변환하여 반환할 SystemTime
*/
BOOL FileTimeToSystemTime(
[in] const FILETIME *lpFileTime,
[out] LPSYSTEMTIME lpSystemTime
);
다음은 FileTimeToSystemTime
입니다.
함수의 이름처럼 FILETIME
을 SYSTEMTIME
으로 변환하는 함수이죠.
이때 변환된 값은 SYSTEMTIME
이면서 UTC(Universal Time Coordinated)
시간 값입니다.
/**
SYSTEMTIME(UTC)을 SYSTEMTIME(Local)으로 변환하는 함수
@param lpTimeZoneInformation 시간의 기준이 되는 지역정보(NULL인 경우 현재 시스템의 지역정보가 들어감)
@param lpUniversalTime 변환할 UTC 시간
@param lpLocalTime 변환하여 반환할 Local 시간
*/
BOOL SystemTimeToTzSpecificLocalTime(
[in, optional] const TIME_ZONE_INFORMATION *lpTimeZoneInformation,
[in] const SYSTEMTIME *lpUniversalTime,
[out] LPSYSTEMTIME lpLocalTime
);
마지막으로 SystemTimeToTzSpecificLocalTime
입니다.
SYSTEMTIME
을 특정 LocalTime
으로 변환합니다.
일반적으로 현재 시스템에서의 시간으로 변환하고 싶을 경우에는 lpTimeZoneInformation
에 NULL
을 넣습니다.
그 이외의 시간으로 변환하고 싶을 경우에는 TIME_ZONE_INFORMATION
을 정의하여 변환하시면 됩니다.
이제 위의 3가지 함수를 이용하여 구현하여봅시다.
/**
Get File Time Info
@param strPath File Path
@param outCreate Create Time
@param outAccess Access Time
@param outWrite Write Time
@return
*/
void GetFileTimes(CString strPath, SYSTEMTIME* outCreate, SYSTEMTIME* outAccess, SYSTEMTIME* outWrite)
{
if (strPath.IsEmpty())
return;
HANDLE hFile = NULL;
try
{
// 파일을 엽니다. (파일 핸들을 연다고 표현함)
hFile = CreateFile(strPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
FILETIME timeCreate;
FILETIME timeAccess;
FILETIME timeWrite;
// 여기서 생성 시간, 접근 시간, 쓰기 시간을 받아옵니다.
BOOL bRet = GetFileTime(hFile, &timeCreate, &timeAccess, &timeWrite);
if (bRet == FALSE)
return;
SYSTEMTIME stimeCreate;
SYSTEMTIME stimeAccess;
SYSTEMTIME stimeWrite;
if (outCreate != nullptr)
{
// 받아온 생성 시간을 시스템 시간으로 변환 (이때 시간은 UTC 시간으로 반환)
bRet = FileTimeToSystemTime(&timeCreate, &stimeCreate);
if (bRet)
// UTC 시간을 Local 시간으로 변환
SystemTimeToTzSpecificLocalTime(NULL, &stimeCreate, outCreate);
}
if (outAccess != nullptr)
{
// 받아온 접근 시간을 시스템 시간으로 변환 (이때 시간은 UTC 시간으로 반환)
bRet = FileTimeToSystemTime(&timeAccess, &stimeAccess);
if (bRet)
// UTC 시간을 Local 시간으로 변환
SystemTimeToTzSpecificLocalTime(NULL, &stimeAccess, outAccess);
}
if (outWrite != nullptr)
{
// 받아온 쓰기 시간을 시스템 시간으로 변환 (이때 시간은 UTC 시간으로 반환)
bRet = FileTimeToSystemTime(&timeWrite, &stimeWrite);
if (bRet)
// UTC 시간을 Local 시간으로 변환
SystemTimeToTzSpecificLocalTime(NULL, &stimeWrite, outWrite);
}
}
// 파일을 닫습니다. (핸들을 닫는다고 표현함)
CloseHandle(hFile);
}
catch (CException& e)
{
TCHAR szException[1024] = { 0, };
e.GetErrorMessage(szException, 1024);
TRACE(szException);
CloseHandle(hFile);
hFile = NULL;
}
}
이것을 실행하여보겠습니다.
예시는 다음과 같습니다.
int main(void)
{
CString strPath = _T("D:\\Android\\AndroidSDK\\platform-tools\\twrp.img");
SYSTEMTIME timeCreate{};
SYSTEMTIME timeAccess{};
SYSTEMTIME timeWrite{};
GetFileTimes(strPath, &timeCreate, &timeAccess, &timeWrite);
printf("Create : %d.%d.%d %d:%d:%d\n", timeCreate.wYear, timeCreate.wMonth, timeCreate.wDay, timeCreate.wHour, timeCreate.wMinute, timeCreate.wSecond);
printf("Access : %d.%d.%d %d:%d:%d\n", timeAccess.wYear, timeAccess.wMonth, timeAccess.wDay, timeAccess.wHour, timeAccess.wMinute, timeAccess.wSecond);
printf("Write : %d.%d.%d %d:%d:%d\n", timeWrite.wYear, timeWrite.wMonth, timeWrite.wDay, timeWrite.wHour, timeWrite.wMinute, timeWrite.wSecond);
return 0;
}
'Study > MFC' 카테고리의 다른 글
[MFC] MFC 에서 Grid를 사용해보자 2 - 생성 및 설정 (MFC Grid Control) (2) | 2022.11.15 |
---|---|
[MFC] MFC 에서 Grid를 사용해보자 1 (MFC Grid Control) (1) | 2022.11.03 |
[MFC] ListBox 컨트롤 (리스트박스) (0) | 2022.10.13 |
[MFC] Radio Button 컨트롤 (라디오 버튼) (0) | 2022.09.03 |
[MFC] Check Box 컨트롤 (체크 박스) (0) | 2022.09.03 |