Coding & Programming/C, C++

[C언어/C++] 윈도우 파일 시간(MAC Time) 직접 수정 하기-SystemTimeToFileTime, LocalFileTimeToFileTime, SetFileTime 함수 예제

mainCodes 2021. 5. 4. 09:56

[C언어/C++] 윈도우 파일 시간(MAC Time) 직접 수정 하기-SystemTimeToFileTime, LocalFileTimeToFileTime, SetFileTime 함수 예제

 

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و

 

지난번에는 SetFileTime, GetFileTime 함수를 스터디하며 파일 간의 MAC Time을 복사하는 방법에 대해 포스팅하였습니다. 이번에는 파일의 MAC Time을 직접 지정한 날짜로 수정하는 방법에 대한 내용입니다.

 

MAC Time

수정 시간(Modification Time), 접근시간(Access Time), 속성 변경 시간(metadata Change Time)

 

예제는 지정한 날짜로 파일의 MAC Time을 수정하기 위해 먼저 사용자로부터 년, 월, 일, 시, 분, 초를 입력받고 SystemTimeToFileTime 함수를 이용하여 파일 타임 형태로 변환합니다. 

 

그런 다음 LocalFileTimeToFileTime 함수를 이용하여 한번 더 파일 타임으로 변환하는데 이는 UTC(Coordinated Universal Time) 타임과의 오차를 고려하기 위함입니다. 만약 LocalFileTimeToFileTime 함수 호출 과정을 생략한다면 3시간 가량 오차가 발생합니다. 

 

🔗 MAC Time 입력 및 수정 예제(Example):

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <stdio.h>
#include <windows.h>
 
int changeFileTime(SYSTEMTIME *sTime, char* writeFilename)
{
    HANDLE writeHandle;
    SYSTEMTIME st;
    FILETIME cTime;
 
    if ((writeHandle = CreateFile(writeFilename, FILE_WRITE_ATTRIBUTES,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL, OPEN_EXISTING, 0NULL)) == INVALID_HANDLE_VALUE)
    {
        puts("CreateFile 에러");
        return -1;
    }
 
    SystemTimeToFileTime(sTime, &cTime);
 
    //UTC를 기준으로 로컬 파일 시간을 파일 시간으로 변환
    //LocalFileTimeToFileTime 함수 호출 과정이 없으면 3시간 정도 오차가 발생함
    LocalFileTimeToFileTime(&cTime, &cTime);
 
    if (SetFileTime(writeHandle, &cTime, &cTime, &cTime) == FALSE)
        puts("SetFileTime 에러");
 
    CloseHandle(writeHandle);
    return 0;
}
 
int main()
{
    char targetFile[] = "maincodes.exe";
    SYSTEMTIME st;
    int year, mon, day, hour, min, sec;
 
    printf(" >> 수정하고자 하는 \"년 월 일 시 분 초\" 순으로 입력하세요.(예: 2030 1 1 22 10 09)\n");
    printf(" >> 입력: ");
    scanf("%d %d %d %d %d %d"&year, &mon, &day, &hour, &min, &sec);
 
    st.wYear = year;    
    st.wMonth = mon;
    st.wDay   = day;
    st.wDayOfWeek = 0;
 
    st.wHour  = hour;
    st.wMinute = min;
    st.wSecond = sec;
    st.wMilliseconds = 0;
 
    if (changeFileTime(&st, targetFile) == 0)
        printf(" >>[%s] 파일의 날짜/시간을 변경하였습니다.\n", targetFile);
    else
        puts("changeFileTime 에러");
 
    return 0;
}
cs

 

🔗 실행결과(Output):

 

 

상 JollyTree였습니다. (•̀ᴗ•́)و