連続したFSEventStreamEventIdを使用して、 kFSEventStreamEventFlagItemRenamedイベントの古い名前と新しい名前を検出できるという議論があります。これは、基本的な名前変更ケースの私のテストではうまくいくようです。ただし、これは次のシナリオではうまくいかないようです。
- イベントのディレクトリtest_dirを監視する
- ファイルAはtest_dirに存在します
- bash ターミナルからコマンドmv AB;touch C;mv CA in test_dirを発行します。
これにより、次のイベントが発生します。
2012-11-06 18:13:01.246 test[45080:1603] event [60095818] [10800] [/Users/tim/test_dir/B]
2012-11-06 18:13:01.248 test[45080:1603] event [60095824] [10900] [/Users/tim/test_dir/C]
2012-11-06 18:13:01.253 test[45080:1603] event [60095825] [10800] [/Users/tim/test_dir/A]
イベント ビット 0x10800 = 「ファイルの名前変更」および 0x10900 = 「ファイルの作成/名前変更」
(FSEvents.h から)
kFSEventStreamEventFlagItemCreated = 0x00000100
kFSEventStreamEventFlagItemRenamed = 0x00000800
kFSEventStreamEventFlagItemIsFile = 0x00010000
このシナリオでは、 AがBに名前が変更されたという事実が失われているようです。
A の場合、60095817 10800 のようなイベントが発生するはずです。
誰でもこの動作を確認できますか?もしそうなら、ディレクトリの内容の個別の表現を維持し、ディレクトリ全体を再スキャン/比較することなく、この制限を処理する方法についてアイデアを持っている人はいますか?
OS X 10.8.2 でテストしています。
編集:これが複数の名前変更に関するより一般的な問題である可能性があることを示す別の議論を見つけました。