如何在cocoa中获取文件夹更改通知(文件夹观察者)

Amr*_*ngh 3 cocoa filesystemwatcher fsevents kqueue

我是Cocoa Application开发的新手.我希望在修改给定目录下的任何文件时(文件夹观察者)通知我的应用程序.修改意味着删除,添加,文件内容被更改.我尝试使用FSEvents也使用NSWorkspace的通知中心或委托消息,如在UKKQueue中http://www.zathras.de/angelweb/sourcecode.htm#UKKQueue.我的应用程序在目录下的任何文件被修改时收到通知.但问题是它没有给出修改后的特定文件的名称或路径.它给出了目录的路径,但没有给出特定文件的路径.

不知道如何在特定文件中查看文件夹进行修改?

Rob*_*ger 6

您必须编写代码来跟踪文件夹的内容,然后每当收到FSEvent文件夹内容已更改的通知时,您需要将存储的文件夹内容信息与实际的当前内容进行比较.

这可能就像一个名为like的可变数组ivar一样简单folderContents,它包含一组文件属性字典.您可以使用从-attributesOfItemAtPath:error:方法NSFileManager或其子集返回的字典.

当您收到文件夹通知时,您需要做的就是遍历存储的词典并检查是否已添加,删除或修改任何文件.该NSFileManager属性字典包含你需要做的这所有的信息.

然后,您需要使用更新的信息更新有关该文件夹的存储信息.


mrw*_*ker 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];
}
Run Code Online (Sandbox Code Playgroud)