首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

Visual C++ 修改檔案/資料夾屬性完全指南:時間戳、唯讀、隱藏與遞迴處理

     編輯:VC 教學

前言:突破系統限制的需求

Windows 檔案總管僅能修改讀寫/隱藏屬性,無法調整建立/修改/存取時間,亦不支援遞迴處理子目錄。本文提供基於 Win32 API 的完整解決方案,並附 MFC 對話框實作代碼。

核心 API 函數群

檔案操作組

  • CreateFile:開啟/建立檔案、目錄、管道等,取得控制代碼
  • FindFirstFile/FindNextFile/FindClose:遞迴列舉檔案
  • GetFileAttributes/SetFileAttributes:讀寫屬性位(唯讀、隱藏、系統、封存)

時間轉換組

  • SystemTimeToFileTime:系統時間 → FILETIME(自 1601 年起的 100 奈秒計數)
  • LocalFileTimeToFileTime:本地時間 → UTC 時間
  • SetFileTime:設定建立/修改/存取三種時間

MFC 對話框實作架構

介面控制項與變數對應

包含檔案路徑編輯框(支援萬用字元)、遞迴勾選框、三種時間的日期/時間編輯框、屬性勾選框(隱藏/唯讀/封存/系統)、執行按鈕。所有變數於建構函數以目前系統時間初始化。

核心遞迴函數 ChangeTheProperty

int 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 區分頂層呼叫與子目錄呼叫
  • 錯誤處理:檢查每個 API 回傳值,失敗時給予使用者提示

應用場景

防毒軟體掃描後時間混亂導致專案重編、批次修改專案檔案屬性、自動化部署腳本等。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved