如何監控rtf文件以檢查是否更新了一段時間(比如15分鐘)。如果沒有更新,則讓主線程知道該文件未更新。我正在考慮使用WaitforSingleObject函數等待最近15分鐘內的任何更改。我怎樣才能實現這種功能性?如何監視文件的更改?
回答
我相信你正在尋找的是文件更改通知,如FindFirstChangeNotification
,FindNextChangeNotification
和ReadDirectoryChangesW
你可以監視一個文件或目錄的更改,重命名,寫入等。
FindFirstChangeNotification/FidNextChangeNotification的問題是,它會通知您在給定目錄中的任何/所有文件上的更改。但在我的情況下,我只對一個特定的文件不感興趣。有什麼辦法可以爲文件設置過濾器嗎? – user2731777
@ user2731777我不知道這樣的功能。您可以使用'ReadDirectoryChangesW'並使用'wcscmp',形式'FILE_NOTIFY_INFORMATION.FileName'來過濾基於名稱的通知。 – 2013-09-01 17:10:32
由於您提到了WaitForSingleObject,因此推測您的平臺是Windows。在這種情況下,您正在尋找的功能是ReadDirectoryChangesW。這將允許您在更改完成後立即收到通知,而無需執行任何輪詢。
吉姆·貝弗裏奇具有優良的兩篇文章是進入一些深度:
可以stat()
文件,檢查其修改日期和採取適當的行動。
您也可以定期計算文件的校驗和並將其與前一個進行比較。
對於RTF文件,您還可以獲取文件的大小並將其與之前的大小進行比較;如果它已被修改,它很可能會有所不同。
所有這些方法可能會引入比其他人提到的系統調用更多的開銷。
雖然你可以做到這一點,但它涉及投票不雅,效率低下 –
我正在發佈你寫的東西的替代品。它們有缺點,但是有效且可以使用。 – Dariusz
但是_why_想要使用一種不雅,低效的方法嗎? –
在我看來,你可以通過兩種方式實現這一點。您可以編寫一個文件篩選器驅動程序,它可以監視文件上的寫入操作。然而這有點拉長。
另一種方法很簡單。在你的主線程中,創建一個你的RTF文件的哈希並對其進行緩存。創建一個處於非信號狀態的事件,創建一個回調函數,創建一個工作線程。在工作線程中等待事件15分鐘。在timout之後,再次生成文件的散列並將其與緩存散列進行比較。如果不匹配,請通過回調函數通知您的主線程。
- 1. 如何監視Python文件的更改?
- 2. 監視文件的更改
- 3. 監視文件的更改
- 4. 監視文件更改Java
- 5. 監視文件更改
- 6. 文件監視和更改
- 7. PHP:監視文本文件的更改
- 8. 監視文件夾的更改
- 9. 使用libuv監視文件更改
- 10. 監視文件更改 - Asyncio和Flask
- 11. FileSystemWatcher和監視配置文件更改
- 12. 監視文件更改目錄
- 13. cron作業來監視文件更改
- 14. C#:使用FileSystemWatcher監視文件更改
- 15. 如何監視遠程目錄和文件的更改?
- 16. 如何監視特定文件以查看Mercurial中的更改?
- 17. 如何監視json文件中的數據更改
- 18. 如何監視Java EE應用程序中的文件更改?
- 19. 如何監視遠程計算機上的文件更改?
- 20. 如何監視HAML文件的更改並保存它們
- 21. 使用gruntjs,如何監視.coffee文件中的更改?
- 22. 如何監視OS X上的文件更改?
- 23. 系統如何監聽文件更改?
- 24. 如何監視[NSCursor currentCursor]中的更改?
- 25. 如何監視網站中的更改?
- 26. 如何監視Windows目錄的更改?
- 27. 如何使用QFileSystemWatcher監視文件夾以進行更改
- 28. 如何使用Visual Studio ASP.NET Core監視文件更改「dotnet watch」
- 29. 如何使用HHVM監視文件更改?
- 30. GruntJS如何監視所有文件,但僅處理那些更改的文件?
這是用什麼操作系統? http://stackoverflow.com/questions/1938939/get-file-last-modify-time-and-compare http://stackoverflow.com/questions/1938939/get-file-last-modify-time-and-compare - 或只是用時間戳緩存內容(或它的散列)並在超時時比較它 – x29a
由於winapi中的WaitForSingleObject,我將在這裏將它留在這裏:http://msdn.microsoft.com/en-us/library /windows/desktop/aa365261(v=vs.85).aspx – user1837009
@scones這是一個Windows問題,無論如何,您使用的是Linux文檔的錯誤源代碼。你應該參考kernel.org。 –