3

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

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

4

2 回答 2

7

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

这可能是一个简单的可变数组 ivar,命名为folderContents,它包含一组文件属性字典。您可以使用从-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 回答