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

檔案系統與登錄檔監視程式開發指南

     編輯:關於C++

監視程式在背景持續偵測系統關鍵資訊變更,如登錄檔修改、檔案系統異動等。雖然資源管理器可手動查看,但面對數萬個檔案與龐大登錄檔,人工檢查不切實際。監視程式的核心價值在於自動記錄軟體安裝前後的系統差異,為完整解除安裝提供依據,避免殘留垃圾佔用磁碟空間。市面知名工具如 Uninstaller Manager、RegMonitor 均採用此技術。

一、核心 API 函數

函數用途
FindFirstChangeNotification建立監視通知控制代碼,指定路徑、是否遞迴子目錄、監視事件類型
FindNextChangeNotification請求系統在下一次偵測到變更時發出通知
WaitForSingleObject / WaitForMultipleObjects等待變更通知訊號,可設定無限等待或超時
FindCloseChangeNotification關閉通知控制代碼,結束監視前必須呼叫

FindFirstChangeNotification 參數詳解

HANDLE FindFirstChangeNotification(
    LPCTSTR lpPathName,        // 監視路徑
    BOOL    bWatchSubtree,     // TRUE=包含子目錄
    DWORD   dwNotifyFilter     // 監視事件篩選器(可組合)
);

dwNotifyFilter 常用旗標

  • FILE_NOTIFY_CHANGE_FILE_NAME:檔案名稱變更(建立/刪除/重命名)
  • FILE_NOTIFY_CHANGE_DIR_NAME:目錄名稱變更
  • FILE_NOTIFY_CHANGE_SIZE:檔案大小變更
  • FILE_NOTIFY_CHANGE_ATTRIBUTES:檔案屬性變更
  • FILE_NOTIFY_CHANGE_LAST_WRITE:最後寫入時間變更
  • FILE_NOTIFY_CHANGE_SECURITY:安全性描述項變更

二、完整範例:監視 C:\PWin98 目錄檔案異動

C++ Builder 4 程式碼,偵測到變更時在 Edit 控制項顯示提示:

void __fastcall TForm1::FormCreate(TObject *Sender) {
    DWORD dwWaitStatus;
    HANDLE hChangeHandle = FindFirstChangeNotification(
        "C:\\PWin98", FALSE, FILE_NOTIFY_CHANGE_FILE_NAME);

    if (hChangeHandle == INVALID_HANDLE_VALUE)
        ExitProcess(GetLastError());

    while (true) {
        dwWaitStatus = WaitForSingleObject(hChangeHandle, INFINITE);
        switch (dwWaitStatus) {
            case WAIT_OBJECT_0: // 偵測到變更
                Edit1->Text = "Something Changed";
                FindCloseChangeNotification(hChangeHandle);
                ExitProcess(EXIT_SUCCESS);
            default:
                ExitProcess(GetLastError());
        }
    }
}

三、登錄檔監視

對應 API:RegNotifyChangeKeyValue,用法類似,可監視特定登錄鍵值的變更(名稱、屬性、內容、安全性等),此處不贅述。

四、進階應用與擴展方向

  • 持久化記錄:將變更事件寫入資料庫或日誌檔,支援事後查詢與比對。
  • 多路徑同時監視:建立多個通知控制代碼,搭配 WaitForMultipleObjects 統一等待。
  • 過濾噪音:排除系統暫存檔、瀏覽器快取等高頻變更路徑,聚焦關鍵區域。
  • 整合解除安裝器:安裝前快照、安裝後比對,產生精確解除安裝腳本。

五、開發提示

  • C++ Builder 對 Win32 API 支援極佳,程式碼易移植至 VC++、Delphi 等環境。
  • 監視迴圈建議放在背景執行緒,避免阻塞主 UI。
  • 務必在程式結束前呼叫 FindCloseChangeNotification 釋放核心資源。
  • Vista/Win7+ 另有 ReadDirectoryChangesW 提供更豐富資訊(具體變更檔案名、動作類型),可考慮升級。

掌握檔案系統與登錄檔監視技術,是開發系統工具、安全軟體、安裝追蹤器的關鍵基石。

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