用例:第三方應用程序希望以編程方式監視由另一個程序生成的文本文件。文本文件包含要更新時要分析的數據。如何使用C++監視文本文件更改?難度:無.NET
我發現很多圍繞FileSystemWatcher的問題的答案,但假設您正在爲Windows計算機編寫應用程序,但無法保證安裝.NET。
是否有任何圖書館可用於此,或者我只是將不得不推出我自己的解決方案呢?
謝謝。
用例:第三方應用程序希望以編程方式監視由另一個程序生成的文本文件。文本文件包含要更新時要分析的數據。如何使用C++監視文本文件更改?難度:無.NET
我發現很多圍繞FileSystemWatcher的問題的答案,但假設您正在爲Windows計算機編寫應用程序,但無法保證安裝.NET。
是否有任何圖書館可用於此,或者我只是將不得不推出我自己的解決方案呢?
謝謝。
您可以使用FindFirstChangeNotification監控任何窗口上的目錄。
如果你知道文件的位置,那麼它很有效 - 否則你可以使用下面描述的虛擬驅動程序/ Filemon來檢查系統上任何地方的改變。
示例代碼here
看起來像這樣:Tracing which process that has opened a particular file
再次sysinternal給出了一些提示和tools
一個簡單的解決辦法是檢查文件的最後修改時間戳記。
如果您使用_stat64()函數來執行此操作,它將成爲一個跨平臺的解決方案。
示例代碼:
struct __stat64 fileinfo;
if(-1 != _stat64(filename, &fileinfo)
return fileinfo.st_mtime;
這聽起來很像什麼FileMon的,Sysinternals公司(現爲MS)一樣。他們通過創建一個動態加載的虛擬設備驅動程序來實現這一點。他們有它是如何工作here一個很好的說明:
FileMon的作品
對於Windows 9x的驅動程序,FileMon的的心臟 是如何在虛擬設備驅動程序 ,Filevxd.vxd。它是動態加載 ,並在其初始化它 安裝通過 的VxD服務, IFSMGR_InstallFileSystemApiHook一個文件系統過濾器,以 將自身插入到的 調用鏈中的所有文件系統請求。在Windows NT FileMon之的心臟是創建和 附加過濾裝置對象 目標文件系統設備中的文件 系統驅動程序對象,以便 該FileMon的會看到所有的IRP和被引導至硬盤 FastIO請求。 當FileMon發現打開,創建或關閉調用時,它會更新內部 散列表,該內部散列表充當內部文件句柄和文件 之間的映射 路徑名稱。每當它看到基於句柄的調用 時,它將在哈希表中查找 句柄以獲取 全名以供顯示。如果 基於句柄的訪問引用FileMon啓動之前打開的文件 ,FileMon 將無法找到其 散列表中的映射,而只是簡單地顯示 句柄的值。
值得注意的是FindFirstChangeNotification在單個文件上不起作用。 – 2010-09-17 10:03:52