簡體   English   中英

如何在 C/C++ 中收到文件/目錄更改的通知,最好使用 POSIX

[英]How to be notified of file/directory change in C/C++, ideally using POSIX

主題說明了一切 - 通常簡單且跨平台的方式是智能地進行投票。 但是每個操作系統都有一些無需輪詢的方式來通知。 是否有可能以合理的跨平台方式進行? (我只關心 Windows 和 Linux,但我使用的是 mac,所以我認為 posix 可能會有所幫助?)

Linux用戶可以使用inotify

inotify 是一個提供文件系統事件通知的 Linux kernel 子系統。

Windows 研究員的一些好東西:

Qt 庫有一個QFileSystemWatcher class,它在文件更改時提供跨平台通知。 即使您沒有使用 Qt,因為源代碼可用,您也可以將其作為您自己實現的示例查看。 Qt 對 Windows、Linux 和 Mac 有單獨的實現。

Leopard 有文件系統事件 API

實際上,我之前已經構建了這個系統,用於商業 C++ 代碼庫——只要你不需要在陽光下所有奇怪的東西,Windows 和 POSIX 系統有很多你可以抽象的重疊。

POSIX:使用 inotify——它是為這項工作而構建的完整系統
Windows:使用“更改事件”。 您必須自己構建更多的粘合劑和報告(您需要的所有 API 都可用,只是沒有一站式購物 inotify 為您提供)。

您可以在“通知線程”中檢測到轉發事件的常見內容是:
1)基本上任何侵入性操作 boost::filesystem 都支持,(可能)修改權限除外。 這是諸如移動、創建、刪除、復制文件夾和文件之類的事情。
2)讀取和寫入文件(尤其是寫入)。 請注意,如果您使用異步 I/O,通知可能會亂序顯示。
3)當一個新卷進來時,比如有人連接了 flash 驅動器。

inotify 尤其為您提供了瘋狂的細粒度控制,Windows 則更少。 使用 inotify,如果您真的想要,您可以幾乎實時地監控文件系統正在執行的所有操作。 我知道#3 在沒有輪詢的情況下都是可能的,但請注意,讓它在任何一個系統上正常工作都非常棘手。

我不認為 POSIX 本身有這方面的設施。 我見過的最接近跨平台的是FAM ,它似乎適用於 Linux、BSD 和 Irix,但我並不容易將它移植到 Windows 和 MacOS。

我相信 OS X 現在有適當的鈎子/回調,因為 Spotlight 索引需要它們。

在 linux 上,您會遇到額外的麻煩,即常用的多個文件系統。 如果您只需要有限數量的文件/目錄的功能,我會嘗試定期主動尋找修改。

libeventlibev似乎是您想要的,盡管我沒有使用它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM