[英]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.