2008-10-23 81 views
4

用例:第三方應用程序希望以編程方式監視由另一個程序生成的文本文件。文本文件包含要更新時要分析的數據。如何使用C++監視文本文件更改?難度:無.NET

我發現很多圍繞FileSystemWatcher的問題的答案,但假設您正在爲Windows計算機編寫應用程序,但無法保證安裝.NET。

是否有任何圖書館可用於此,或者我只是將不得不推出我自己的解決方案呢?

謝謝。

回答

8

您可以使用FindFirstChangeNotification監控任何窗口上的目錄。
如果你知道文件的位置,那麼它很有效 - 否則你可以使用下面描述的虛擬驅動程序/ Filemon來檢查系統上任何地方的改變。

示例代碼here

5

一個簡單的解決辦法是檢查文件的最後修改時間戳記。

如果您使用_stat64()函數來執行此操作,它將成爲一個跨平臺的解決方案。

示例代碼:

struct __stat64 fileinfo; 

if(-1 != _stat64(filename, &fileinfo) 
    return fileinfo.st_mtime; 
+1

值得注意的是FindFirstChangeNotification在單個文件上不起作用。 – 2010-09-17 10:03:52

1

這聽起來很像什麼FileMon的,Sysinternals公司(現爲MS)一樣。他們通過創建一個動態加載的虛擬設備驅動程序來實現這一點。他們有它是如何工作here一個很好的說明:

FileMon的作品

對於Windows 9x的驅動程序,FileMon的的心臟 是如何在虛擬設備驅動程序 ,Filevxd.vxd。它是動態加載 ,並在其初始化它 安裝通過 的VxD服務, IFSMGR_InstallFileSystemApiHook一個文件系統過濾器,以 將自身插入到的 調用鏈中的所有文件系統請求。在Windows NT FileMon之的心臟是創建和 附加過濾裝置對象 目標文件系統設備中的文件 系統驅動程序對象,以便 該FileMon的會看到所有的IRP和被引導至硬盤 FastIO請求。 當FileMon發現打開,創建或關閉調用時,它會更新內部 散列表,該內部散列表充當內部文件句柄和文件 之間的映射 路徑名稱。每當它看到基於句柄的調用 時,它將在哈希表中查找 句柄以獲取 全名以供顯示。如果 基於句柄的訪問引用FileMon啓動之前打開的文件 ,FileMon 將無法​​找到其 散列表中的映射,而只是簡單地顯示 句柄的值。