簡體   English   中英

Mac OS X中的文件級文件系統更改通知

[英]File-level filesystem change notification in Mac OS X

我希望在修改給定目錄下(直接或間接)任何文件時通知我的代碼。 通過“修改”,我的意思是我希望每當文件的內容被更改,重命名或刪除時都會通知我的代碼; 或者是否添加了新文件。 對於我的應用程序,可能有數千個文件。

我看起來像FSEvents,但其技術概述部分地說:

需要注意的重點是通知的粒度在目錄級別。 它只告訴您目錄中的某些內容已更改,但不會告訴您更改的內容。

它還說:

文件系統事件API也不是為了查找特定文件何時更改而設計的。 出於這種目的,kqueues機制更合適。

但是,為了在給定文件上使用kqueue,必須打開文件以獲取文件描述符。 管理數千個文件描述符是不切實際的(並且可能會超過最大允許的打開文件描述符數)。

奇怪的是,在Windows下,我可以使用ReadDirectoryChangesW()函數,它正是我想要的。

那么如何在Mac OS X下做我想做的事情呢? 或者,問另一種方式:如何在用戶空間中為Mac OS X編寫等效的ReadDirectoryChangesW() (並且非常有效地執行此操作)?

編輯:未經驗證,但Konstantin在下面指出此代碼示例已於2012年過時。

我不相信你正在尋找的是一個特定的API。 Apple提供了類似問題的示例代碼,稱為Watcher 它不是你想要的,但它是你現在能做的最好的事情。 您必須拍攝目錄的快照,並在發現更改后重新掃描目錄。 如果您可以信任修改時間,修改時間當然是檢查的最佳選擇。

你可能是正確的,試圖注冊無限數量的kqueues可能是行不通的。

我自己沒有嘗試過,但似乎FSEvents能夠提​​供10.7(Lion)的文件級通知。 FSEventStreamCreateFlags的描述

kFSEventStreamCreateFlagFileEvents

請求文件級通知。 您的流將接收有關您正在觀看的層次結構中的各個文件的事件,而不是僅接收目錄級別通知。 小心使用此標志,因為它會產生比沒有它時更多的事件。

適用於OS X v10.7及更高版本。

與Mac OS X上的需求相匹配的最接近的實用程序(我知道)是fslogger 請參閱鏈接以獲取描述,dmg和源代碼: OSXBook - fslogger

您可能想要查看man fs_usage ,雖然它不是特定於目錄並且需要root權限。

暫無
暫無

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

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