Amr*_*ngh 3 cocoa filesystemwatcher fsevents kqueue
我是Cocoa Application开发的新手.我希望在修改给定目录下的任何文件时(文件夹观察者)通知我的应用程序.修改意味着删除,添加,文件内容被更改.我尝试使用FSEvents也使用NSWorkspace的通知中心或委托消息,如在UKKQueue中http://www.zathras.de/angelweb/sourcecode.htm#UKKQueue.我的应用程序在目录下的任何文件被修改时收到通知.但问题是它没有给出修改后的特定文件的名称或路径.它给出了目录的路径,但没有给出特定文件的路径.
不知道如何在特定文件中查看文件夹进行修改?
您必须编写代码来跟踪文件夹的内容,然后每当收到FSEvent文件夹内容已更改的通知时,您需要将存储的文件夹内容信息与实际的当前内容进行比较.
这可能就像一个名为like的可变数组ivar一样简单folderContents,它包含一组文件属性字典.您可以使用从-attributesOfItemAtPath:error:方法NSFileManager或其子集返回的字典.
当您收到文件夹通知时,您需要做的就是遍历存储的词典并检查是否已添加,删除或修改任何文件.该NSFileManager属性字典包含你需要做的这所有的信息.
然后,您需要使用更新的信息更新有关该文件夹的存储信息.
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)
| 归档时间: |
|
| 查看次数: |
4760 次 |
| 最近记录: |