2011-08-17 15 views
0

kqueueを使用して、UKKQueueというラッパー(here)を使用して1つのファイルのエディションを監視しようとしています。このラッパーは、ここでは、非常に簡単です私が使用しているテストコードです:/Users/bruno/Desktop/SyncTestLogファイルの保存後のファイルモニターの停止

@implementation FileMonitorTestAppDelegate 

@synthesize window; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    fileWatcher = [[UKKQueue alloc] init]; 
    [fileWatcher addPath:@"/Users/bruno/Desktop/SyncTestLog"]; 
    [fileWatcher setDelegate:self]; 
} 

- (void)dealloc { 
    [fileWatcher release]; 
} 

-(void) watcher: (id<UKFileWatcher>)kq receivedNotification: (NSString*)nm forPath: (NSString*)fpath { 
    NSLog(@"UKFileWatcher: %@ - notification: %@ - filePath: %@", kq, nm, fpath); 
} 

@end 

ファイルはプレーンテキストファイルです。予想通り、私は端末から出力番組をnanoを使用してそれを編集する場合:

2011-08-17 11:46:27.316 FileMonitorTest[1235:707] UKFileWatcher: <UKKQueue: 0x100117da0> - notification: UKKQueueFileWrittenToNotification - filePath: /Users/bruno/Desktop/SyncTestLog 
2011-08-17 11:46:27.317 FileMonitorTest[1235:707] UKFileWatcher: <UKKQueue: 0x100117da0> - notification: UKKQueueFileSizeIncreasedNotification - filePath: /Users/bruno/Desktop/SyncTestLog 
2011-08-17 11:46:27.751 FileMonitorTest[1235:707] UKFileWatcher: <UKKQueue: 0x100117da0> - notification: UKKQueueFileAttributesChangedNotification - filePath: /Users/bruno/Desktop/SyncTestLog 

を今、私は、ファイルを保存する最初の時間が経過した後のTextEditやTextWranglerの監視停止の報告の変更を使用してそれを編集するとき。相続人は、最後のイベントが報告されます。

2011-08-17 10:57:45.792 FileMonitorTest[897:707] UKFileWatcher: <UKKQueue: 0x10035ae10> - notification: UKKQueueFileAttributesChangedNotification - filePath: /Users/bruno/Desktop/SyncTestLog 
2011-08-17 10:57:46.463 FileMonitorTest[897:707] UKFileWatcher: <UKKQueue: 0x10035ae10> - notification: UKKQueueFileAttributesChangedNotification - filePath: /Users/bruno/Desktop/SyncTestLog 
2011-08-17 10:57:54.043 FileMonitorTest[897:707] UKFileWatcher: <UKKQueue: 0x10035ae10> - notification: UKKQueueFileDeletedNotification - filePath: /Users/bruno/Desktop/SyncTestLog 

を私の知る限りUKKQueueフラグO_EVTONLYを使用してopen()とUnixライクなファイルディスクリプタを取得理解して。何らかの理由で、TextEdit(およびTextWrangler)はファイルを保存するときにこのUKKQueueFileDeletedNotification通知を生成します。

私が必要とするのは、「永遠に」ファイルの変更を聴き続けることです。私はUKKQueueFileDeletedNotificationが到着したときにモニターを作り直すことができると思うが、もっときれいなものを探している。

おかげ

編集: を私はちょうどのが私の問題を解決するためGTMFileSystemKQueue呼ばGoogle Toolbox For Macでクラスを見つけましたよ。まだ私の質問の答えはありません。

答えて

3

私は現代のObjective-CでUKKQueueを書き直しました。新しいクラスは同じように動作しますが、それは単純に、より速く、合理化されています。この記事で説明されているバグもいくつか修正されています。ファイルに直接書き込むが、最初に書き込みをしないここに落とし穴がテキストエディットとTextWranglerの保存(または...atomically:YES)安全な使用していることであるhttp://github.com/bdkjones/VDKQueue

+0

こんにちはブライアン。 mi(私たち)がそれについて知ってくれてありがとう、ありがとう。よろしくお願いします。 –

+0

GojaNがUKKQueueで持っていたのと同じ問題がVDKQueueで発生しています。テキストファイルを保存した後、一度起動してから停止します。何か案は? – bijan

+0

@bijanとGojaN、UKKQueueまたはVDKQueueでこれに対する解決策を見つけましたか?私も同じ問題に直面しています。 – Subhash

1

あなたはここに新しいクラス、VDKQueueを、見つけることができます一時ファイルを作成し、ファイルの名前を変更して元のパスを一時的な場所に保存されたファイルに置き換えます。

あなたのkqueueは、安全保存メカニズムによって削除された元のファイルを監視します。

GTMFileSystemKQueueは、削除/名前の変更操作を監視し、元のパスに対してkqueueを再登録します。 UKKQueueとVDKQueueのクイックチェックはどちらもこれをしないことを示唆しているようです。

関連する問題