2012-09-02 74 views
4

我在FSEvents上看到奇怪的行爲,我在恢復模式下掛載我的驅動器,並在重新啓動時在我的流中獲取零fsevents。 我做到以下幾點:FSEvents處理由其他操作系統更改的磁盤

  1. 啓動定期
  2. 與FSEventsGetCurrentEventId()
  3. 引導恢復模式,並在觀看路徑修改文件
  4. 重新啓動系統
  5. 記錄當前事件

發生這種情況時,我使用fsevents API時根本沒有收到任何事件。它在kFSEventStreamEventFlagHistoryDone sentinel中發送的唯一標誌,即使我在常規操作系統上做了其他更改。

ars technica review似乎意味着,當你安裝一些其他的設備上,你應該得到的kFSEventStreamEventFlagMustScanSubDirs標誌,但我沒有看到這種行爲。有沒有人遇到過這個?有沒有更好的方法來檢測和處理在操作系統關閉的情況下驅動器已安裝在別處的情況?

更新:我嘗試了從linux啓動和修改文件系統的相同的東西。無論如何,我沒有得到0事件的奇怪行爲,但我也沒有從我更改的目錄或MustScanSubdirs標誌中獲得事件。

更新2:在this thread,接受的迴應說,當這種情況發生時,時間機器在上述情況下檢測到日誌已過期。任何人都知道如何檢測日誌是否過期?這個日期可以用來代替一個標誌。

回答

2

我想你還需要在步驟#2中存儲FSEvents數據庫的UUID,並在步驟#4中檢查它。

此行爲vaguely mentioned in Apple's documentation(強調):

注:因爲磁盤可以通過運行早期版本的OS X(或潛在的其他操作系統)的計算機上進行修改,你應該把事件列表作爲諮詢意見,而不是所有數量變化的確切清單。 如果磁盤被運行先前版本的OS X的計算機修改,則歷史日誌將被丟棄。

例如,備份軟件仍應定期執行任何卷的全面掃描,以確保沒有更改通過裂縫落下。

備註歷史日誌中的位被丟棄,然後看reference(強調):

FSEventStreamGetLatestEventId() - >最初,此方法返回當流是供應的 sinceWhen值創建;此後,在調用客戶端回調之前, 被更新爲當前 批事件中提到的編號最大的事件ID。 客戶端 可以持久存儲此值,只要它們還存儲設備的UUID (通過FSEventsCopyUUIDForDevice()獲取)。只要其UUID匹配 存儲的內容,客戶端可以稍後將此事件ID作爲sinceWhen參數提供給 FSEventStreamCreateRelativeToDevice()。這是有效的,因爲FSEvents服務將事件 存儲在持久的每卷數據庫中。在這方面,事件ID的流作爲一個全局的系統範圍的時鐘,但對於任何特定的時基都沒有關係 。

FSEventsCopyUUIDForDevice() - >獲取唯一標識 該卷的FSEvents數據庫一個UUID。 如果數據庫被丟棄 那麼它的置換將有不同的UUID,以便客戶端將 能夠檢測到這種情況,並避免嘗試使用事件ID,它們存儲爲sinceWhen參數 的 FSEventStreamCreate ...()功能。

注意,UUID是每個設備,所以如果你有安裝的目錄樹中的任何文件系統,你可能需要得到他們每個人的UUID。

祝你好運!

相關問題