0

ここでkqueue入手できる UKKQueue というラッパーを使用して、単一のファイルのエディションを監視しようとしています。このラッパーは非常にシンプルです。使用しているテスト コードは次のとおりです。

@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

のファイル/Users/bruno/Desktop/SyncTestLogはプレーン テキスト ファイルです。ターミナルから使用して編集すると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 はフラグを使用してopen()O_EVTONLYで unix のようなファイル記述子を取得します。何らかの理由で、TextEdit (および TextWrangler) はUKKQueueFileDeletedNotification、ファイルを保存するときにこの通知を生成します。

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

ありがとう

編集: Google Toolbox For Macで、問題を解決するGTMFileSystemKQueueというクラスが 見つかりました。私の質問に対する答えはまだありません。

4

2 に答える 2

3

最新の Objective-C で UKKQueue を書き直しました。新しいクラスは同じように機能します。単純に、より良く、より速く、合理化されています。また、この投稿で説明されているバグと他のいくつかのバグも修正されています。

新しいクラス VDKQueue は、http://github.com/bdkjones/VDKQueue にあります

于 2012-03-30T02:50:29.340 に答える
1

ここで問題なのは、TextEdit と TextWrangler が安全な保存 (または...atomically:YES) を使用していることです。これは、ファイルに直接書き込むのではなく、最初に一時ファイルに書き込み、次にファイルの名前を変更して、元のパスを一時的な場所に保存されたファイルに置き換えます。

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

GTMFileSystemKQueueacrossReplaceは、削除/名前変更操作を監視し、元のパスに対して kqueue を再登録するパラメーターのために機能します。UKKQueue と VDKQueue の簡単なチェックは、どちらもこれを行わないことを示唆しているようです。

于 2012-10-23T12:22:56.087 に答える