一般應用程式僅關心檔案內容與大小,但在備份、同步、審計等嚴格場景,必須完整保留建立時間、最後存取時間、最後修改時間、唯讀/隱藏/封存等屬性。Win32 API 提供 WIN32_FIND_DATA 結構與 SetFileTime、SetFileAttributes 函式,可完整讀寫這些中繼資料。
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes; // 檔案屬性
FILETIME ftCreationTime; // 建立時間
FILETIME ftLastAccessTime; // 最後存取時間
FILETIME ftLastWriteTime; // 最後修改時間
DWORD nFileSizeHigh; // 檔案大小高 32 位
DWORD nFileSizeLow; // 檔案大小低 32 位
DWORD dwReserved0;
DWORD dwReserved1;
TCHAR cFileName[MAX_PATH]; // 長檔名
TCHAR cAlternateFileName[14];// 8.3 短檔名
} WIN32_FIND_DATA;
WIN32_FIND_DATA findData;
HANDLE hFind = FindFirstFile(_T("C:\\Test.txt"), &findData);
if (hFind != INVALID_HANDLE_VALUE) {
FindClose(hFind); // 僅需第一筆,立即關閉
// 將屬性複製到自訂結構備份
FILE_INFO info;
_tcscpy(info.szFileTitle, _T("Test.txt"));
info.dwFileAttributes = findData.dwFileAttributes;
info.ftCreationTime = findData.ftCreationTime;
info.ftLastAccessTime = findData.ftLastAccessTime;
info.ftLastWriteTime = findData.ftLastWriteTime;
info.nFileSizeHigh = findData.nFileSizeHigh;
info.nFileSizeLow = findData.nFileSizeLow;
}
HANDLE hFile = CreateFile(_T("C:\\Dest.txt"),
GENERIC_WRITE,
FILE_SHARE_READ,
NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE) {
SetFileTime(hFile,
&info.ftCreationTime,
&info.ftLastAccessTime,
&info.ftLastWriteTime);
CloseHandle(hFile);
}
SetFileAttributes(_T("C:\\Dest.txt"), info.dwFileAttributes);
typedef struct _FILE_INFO {
TCHAR szFileTitle[128];
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
} FILE_INFO;
FindFirstFile 取得來源檔案 WIN32_FIND_DATA。FILE_INFO 結構保存。CopyFile 或自行讀寫)。SetFileTime 還原三個時間戳。SetFileAttributes 還原屬性旗標。FileTimeToLocalFileTime 再 FileTimeToSystemTime。FindFirstFile 僅回傳第一筆符合項目;若需列舉目錄請搭配 FindNextFile。