3

Cocoa アプリケーション開発は初めてです。特定のディレクトリの下にあるファイルが変更されたときにアプリケーションに通知するようにします (フォルダー ウォッチャー)。修正とは、ファイルの内容が削除、追加、変更されたことを意味します。http://www.zathras.de/angelweb/sourcecode.htm#UKKQueueの UKKQueue のように、NSWorkspace の通知センターまたはデリゲート メッセージを使用して FSEvents を使用してみました。ディレクトリの下のファイルが変更されると、私のアプリケーションは通知を受け取りました。しかし、問題は、変更された特定のファイルの名前またはパスを指定していないことです。ディレクトリのパスを提供しますが、特定のファイルのパスは提供しません。

特定のファイルの変更についてフォルダーを監視するにはどうすればよいですか??

4

2 に答える 2

7

フォルダーの内容を追跡するコードを作成する必要があります。その後FSEvent、フォルダーの内容が変更されたという通知を受け取るたびに、フォルダーの内容に関する保存された情報を実際の現在の内容と比較する必要があります。

folderContentsこれは、一連のファイル属性辞書を含む、 のような名前の変更可能な配列 ivar のような単純なものである可能性があります。-attributesOfItemAtPath:error:のメソッドNSFileManagerまたはそのサブセットから返された辞書を使用できます。

フォルダー通知を受け取ったときに行う必要があるのは、保存されている辞書を反復処理し、ファイルが追加、削除、または変更されていないかどうかを確認することだけです。属性ディクショナリには、これNSFileManagerを行うために必要なすべての情報が含まれています。

次に、フォルダーに関する保存された情報を更新された情報で更新する必要があります。

于 2011-12-21T22:28:04.040 に答える
5

NSMetadataQuery は、フォルダーの監視に適しています。

- (void)setupWatchedFolder {
    NSString *watchedFolder = @"/path/to/foo";

    NSMetadataQuery *query = [[NSMetadataQuery alloc] init];
    [query setSearchScopes:@[watchedFolder]];
    [query setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE '*.*'", NSMetadataItemFSNameKey]];

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    [nc addObserver:self selector:@selector(queryFoundStuff:) name:NSMetadataQueryDidFinishGatheringNotification object:query];
    [nc addObserver:self selector:@selector(queryFoundStuff:) name:NSMetadataQueryDidUpdateNotification object:query];

    [query startQuery];
}

- (void)queryFoundStuff:(NSNotification *)notification {

    NSMetadataQuery *query = self.metadataQuery;
    [query disableUpdates];

    NSMutableArray *results = [NSMutableArray arrayWithCapacity:self.metadataQuery.resultCount];

    for (NSUInteger i=0; i<self.metadataQuery.resultCount; i++) {
        [results addObject:[[self.metadataQuery resultAtIndex:i] valueForAttribute:NSMetadataItemPathKey]];
    }

    // do something with you search results
    // self.results = results;

    [query enableUpdates];
}
于 2012-08-23T19:23:01.927 に答える