檔案的時間屬性一般包括:建立時間、最後修改時間、最後訪問時間。一般的擷取方法是:“右鍵”滑鼠---->“屬性”。而對於時間的修改則不能隨意進行,尤其是建立時間。本文通過代碼實現對檔案時間屬性的擷取、修改。
1、檔案時間屬性擷取
以"123.doc”檔案為例(該檔案置於代碼同一路徑,下同),擷取其最後訪問時間,其他兩項時間屬性同理:
#include<iostream>#include<Windows.h>using namespace std;int main(){HANDLE hFile=CreateFile( "123.doc", // 檔案名稱指標 GENERIC_WRITE,// 訪問模式 FILE_SHARE_READ, // 共用模式 NULL, //安全屬性 OPEN_EXISTING, // 建立方式 FILE_ATTRIBUTE_NORMAL, // 檔案屬性 NULL // 指向待覆制屬性的檔案指標 );FILETIME createTime;FILETIME lastAccessTime;//本例擷取最後訪問時間,其他兩項同理FILETIME lastWriteTime;if(INVALID_HANDLE_VALUE!=hFile) { if (GetFileTime(hFile,&createTime,&lastAccessTime,&lastWriteTime)) { SYSTEMTIME st; memset(&st,0x0,sizeof(st)); FileTimeToSystemTime(&lastAccessTime,&st);//將檔案時間格式轉換為系統時間格式(UTC格式),可以看到小時數比真實的小了8 TIME_ZONE_INFORMATION tz; ::GetTimeZoneInformation(&tz);//擷取當地時區資訊 SYSTEMTIME localST; ::SystemTimeToTzSpecificLocalTime(&tz,&st,&localST);//將UTC時間格式轉換為當地時間格式,因為中國是東8區,所以轉換時在小時上加了8(本函數轉換時自動加的) printf("最後訪問時間為: %d年%d月%d日 %d:%d:%d\n",localST.wYear,localST.wMonth,localST.wDay,localST.wHour,localST.wMinute,localST.wSecond); }} CloseHandle(hFile); return 0;}
2、時間屬性的修改
仍以“123.doc”為例,對檔案的建立時間進行修改。具體代碼如下:
#include<iostream>#include<Windows.h>using namespace std;BOOL SetFileTimeToNewCreateTime(HANDLE hFile,int year,int month,int day,int hour,int minute,int second,int DayofWeek/*星期:0-6*/,int Milliseconds/*毫秒值*/){ FILETIME ft; SYSTEMTIME st;//根據已知資料創造st,即系統時間格式 st.wYear=year; st.wMonth=month; st.wDay=day; st.wHour=hour; st.wMinute=minute; st.wSecond=second; st.wDayOfWeek=DayofWeek; st.wMilliseconds=Milliseconds; SystemTimeToFileTime(&st, &ft); // 轉化為檔案時間格式 BOOL f = SetFileTime(hFile, &ft , //建立時間參數 (LPFILETIME) NULL,//訪問時間(參數為NULL則為不修改) (LPFILETIME) NULL//最後修改時間(同上) ); return f;}int main(){HANDLE hFile=CreateFile( "123.doc", // 檔案名稱指標 GENERIC_WRITE,// 訪問模式 FILE_SHARE_READ, // 共用模式 NULL, //安全屬性 OPEN_EXISTING, // 建立方式 FILE_ATTRIBUTE_NORMAL, // 檔案屬性 NULL // 指向待覆制屬性的檔案指標 );if(SetFileTimeToNewCreateTime(2012,9,27,8,8,8,4/*星期*/,0))//注意:星期與日期相關! printf("更改成功");else printf("更改失敗!");CloseHandle(hFile);return 0;}