Windows 檔案總管僅能修改讀寫/隱藏屬性,無法調整建立/修改/存取時間,亦不支援遞迴處理子目錄。本文提供基於 Win32 API 的完整解決方案,並附 MFC 對話框實作代碼。
CreateFile:開啟/建立檔案、目錄、管道等,取得控制代碼FindFirstFile/FindNextFile/FindClose:遞迴列舉檔案GetFileAttributes/SetFileAttributes:讀寫屬性位(唯讀、隱藏、系統、封存)SystemTimeToFileTime:系統時間 → FILETIME(自 1601 年起的 100 奈秒計數)LocalFileTimeToFileTime:本地時間 → UTC 時間SetFileTime:設定建立/修改/存取三種時間包含檔案路徑編輯框(支援萬用字元)、遞迴勾選框、三種時間的日期/時間編輯框、屬性勾選框(隱藏/唯讀/封存/系統)、執行按鈕。所有變數於建構函數以目前系統時間初始化。
ChangeThePropertyint CChangePropertyDlg::ChangeTheProperty(LPSTR FileName, BYTE bFlag=0) {
char pathname[MAX_PATH], allname[MAX_PATH];
// 擷取目錄路徑
int i = strlen(FileName)-1;
for(; i>=0; i--) if(FileName[i]=='\\') break;
if(i==-1) return 0;
strncpy(pathname, FileName, i+1); pathname[i+1]='\\';
WIN32_FIND_DATA findData;
HANDLE hFind = FindFirstFile(FileName, &findData);
if(hFind == INVALID_HANDLE_VALUE) return 0;
do {
if(strcmp(findData.cFileName, ".")==0 || strcmp(findData.cFileName, "..")==0) continue;
strcpy(allname, pathname);
strcat(allname, findData.cFileName);
if(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if(m_DIRECTORY) ChangeTheProperty(allname, 1); // 遞迴子目錄
} else {
// 修改屬性
if(m_PROPERTY) {
DWORD attr = GetFileAttributes(allname);
if(m_HIDE) attr |= FILE_ATTRIBUTE_HIDDEN; else attr &= ~FILE_ATTRIBUTE_HIDDEN;
if(m_READ) attr |= FILE_ATTRIBUTE_READONLY; else attr &= ~FILE_ATTRIBUTE_READONLY;
if(m_SAVE) attr |= FILE_ATTRIBUTE_ARCHIVE; else attr &= ~FILE_ATTRIBUTE_ARCHIVE;
if(m_SYSTEM) attr |= FILE_ATTRIBUTE_SYSTEM; else attr &= ~FILE_ATTRIBUTE_SYSTEM;
SetFileAttributes(allname, attr);
}
// 修改時間
if(m_ACCESS || m_CREATE || m_MODIFY) {
HANDLE hFile = CreateFile(allname, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if(hFile != INVALID_HANDLE_VALUE) {
FILETIME ftCreate, ftAccess, ftWrite;
SYSTEMTIME st;
// 組合使用者輸入的日期時間填入 st,再轉換
// SystemTimeToFileTime(&st, &ftCreate) ...
// SetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite);
CloseHandle(hFile);
}
}
}
} while(FindNextFile(hFind, &findData));
FindClose(hFind);
return 1;
}
SYSTEMTIME 需正確填入年/月/日/時/分/秒bFlag 區分頂層呼叫與子目錄呼叫防毒軟體掃描後時間混亂導致專案重編、批次修改專案檔案屬性、自動化部署腳本等。