0

誰かがこのコードが機能していないことを教えてもらえますか? iOS 6.0 でアプリケーション ドキュメント ディレクトリを監視している間、常にDISPATH_VNODE_WRITEを返します。(iPad) 以下は私のコードです。ファイルが削除されたり、名前が変更されたり、追加されたりしても、常に0x2を返します:(。これは、監視しているディレクトリであるためですか?ファイルではありません!!!ディレクトリが通知を送信した原因を突き止める方法はありますか? ?

int directoryFileDescripter = open([documentDirectory UTF8String], O_EVTONLY);

if (directoryFileDescripter < 0) {
    NSLog(@"Couldn't obtain file descripter from the system.");
    return;
}

dispatch_queue_t mainQueue = /*dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);*/dispatch_get_main_queue();
if (mainQueue == NULL) {
    NSLog(@"Couldn't obtain mainQueue from the system.");
    close(directoryFileDescripter);
    return;
}

dispSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE, directoryFileDescripter, DISPATCH_VNODE_WRITE | DISPATCH_VNODE_DELETE | DISPATCH_VNODE_RENAME, mainQueue);
if (dispSource == NULL) {
    NSLog(@"Couldn't obtain dispatch source for directory from the system.");
    close(directoryFileDescripter);
    return;
}


dispatch_source_set_event_handler(dispSource, ^{

    NSLog(@"directory notification received.");
    int fileDes = dispatch_source_get_handle(dispSource);
    unsigned long mask = dispatch_source_get_data(dispSource);
    char path[PATH_MAX] = {0};
    int nRes = fcntl(fileDes, F_GETPATH, &path);
    if (nRes < 0) {
        return;
    }
if (mask & DISPATCH_VNODE_WRITE) {
        NSLog(@"A file has been written.");
    }

if (mask & DISPATCH_VNODE_DELETE) {
        NSLog(@"A file has been deleted.");
}

if (mask & DISPATCH_VNODE_RENAME) {
        NSLog(@"A file has been renamed.");
}
});

dispatch_source_set_cancel_handler(dispSource, ^{
    close(directoryFileDescripter);
});

dispatch_resume(dispSource);
4

1 に答える 1

1

あなたは「なぜ」について正しいです。ファイルが作成、名前変更、または削除されると、ディレクトリが変更されます。ディレクトリを監視しているため、「WRITE」イベントが発生します。

通常、ディレクトリが書き込み済みとしてマークされるたびにディレクトリを再スキャンし、自分で変更に注意することで、これに対処します。ディレクトリ自体が移動または削除されることを心配していない場合は、WRITE イベントを監視できます。

もちろん、各ファイルの VNODE を監視することもできますが、この種の問題を適切に実装するのははるかに複雑になると思います。

于 2012-12-06T18:22:00.750 に答える