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

VC++ 取得與修改檔案屬性完整指南

     編輯:VC 教學

前言

一般應用程式僅關心檔案內容與大小,但在備份、同步、審計等嚴格場景,必須完整保留建立時間、最後存取時間、最後修改時間、唯讀/隱藏/封存等屬性。Win32 API 提供 WIN32_FIND_DATA 結構與 SetFileTime、SetFileAttributes 函式,可完整讀寫這些中繼資料。

關鍵結構:WIN32_FIND_DATA

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;
}

修改檔案時間與屬性

1. 設定時間

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);
}

2. 設定屬性(唯讀、隱藏、封存等)

SetFileAttributes(_T("C:\\Dest.txt"), info.dwFileAttributes);

自訂備份結構 FILE_INFO

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;

完整流程:備份並還原檔案完整屬性

  1. 呼叫 FindFirstFile 取得來源檔案 WIN32_FIND_DATA。
  2. 複製到 FILE_INFO 結構保存。
  3. 複製檔案內容(CopyFile 或自行讀寫)。
  4. 對目標檔案呼叫 SetFileTime 還原三個時間戳。
  5. 呼叫 SetFileAttributes 還原屬性旗標。

常見陷阱

  • FILETIME 為 UTC:若需顯示本地時間,必須呼叫 FileTimeToLocalFileTime 再 FileTimeToSystemTime。
  • FindFirstFile 僅回傳第一筆符合項目;若需列舉目錄請搭配 FindNextFile。
  • 修改系統檔案或受保護目錄需管理員權限(UAC 提升)。
  • 網路磁碟機可能不支援完整時間屬性設定,視伺服器實作而定。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved