[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, 0, NULL)) == 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였습니다. (•̀ᴗ•́)و