我是Cocoa应用程序开发的新手。我希望我的应用程序在给定目录下的任何文件被修改时得到通知(文件夹监视器)。Modified表示删除、添加、更改文件内容。我也尝试过使用FSEvents,使用NSWorkspace的通知中心或委托消息,就像在http://www.zathras.de/angelweb/sourcecode.htm#UKKQueue的UKKQueue中一样。当目录下的任何文件被修改时,我的应用程序都会收到通知。但问题是它没有给出被修改的特定文件的名称或路径。它提供目录的路径,但不提供特定文件的路径。
知道如何在特定文件中查看文件夹的修改吗??
发布于 2011-12-22 06:28:04
您必须编写代码来跟踪文件夹的内容,然后每当您收到文件夹内容已更改的FSEvent
通知时,您需要将存储的有关文件夹内容的信息与实际的当前内容进行比较。
这可以是像一个可变数组一样简单的东西,例如folderContents
,它包含一组文件属性字典。您可以使用从NSFileManager
的-attributesOfItemAtPath:error:
方法返回的字典或其子集。
当你收到文件夹通知时,你需要做的就是遍历存储的字典,并检查是否有任何文件被添加、删除或修改。NSFileManager
attributes字典包含执行此操作所需的所有信息。
然后,您需要使用更新后的信息更新您存储的有关文件夹的信息。
发布于 2012-08-24 03:23:02
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];
}
https://stackoverflow.com/questions/8562265
复制相似问题