如何在cocoa中获取文件夹更改通知(文件夹监视程序)
我不熟悉Cocoa应用程序开发。我希望在修改给定目录下的任何文件时通知我的应用程序(文件夹监视程序)。修改意味着删除、添加、更改文件内容。我还尝试使用FSEvents和NSWorkspace的通知中心或代理消息,就像在UKKQueue中一样。当目录下的任何文件被修改时,我的应用程序收到通知。但问题是它没有给出被修改的特定文件的名称或路径。它给出目录的路径,但不给出特定文件的路径如何在cocoa中获取文件夹更改通知(文件夹监视程序),cocoa,filesystemwatcher,fsevents,kqueue,Cocoa,Filesystemwatcher,Fsevents,Kqueue,我不熟悉Cocoa应用程序开发。我希望在修改给定目录下的任何文件时通知我的应用程序(文件夹监视程序)。修改意味着删除、添加、更改文件内容。我还尝试使用FSEvents和NSWorkspace的通知中心或代理消息,就像在UKKQueue中一样。当目录下的任何文件被修改时,我的应用程序收到通知。但问题是它没有给出被修改的特定文件的名称或路径。它给出目录的路径,但不给出特定文件的路径 你知道如何在特定文件中查看文件夹的修改吗???你必须编写代码来跟踪文件夹的内容,然后每当收到文件夹内容已更改的FSEv
你知道如何在特定文件中查看文件夹的修改吗???你必须编写代码来跟踪文件夹的内容,然后每当收到文件夹内容已更改的
FSEvent
通知时,你需要将存储的文件夹内容信息与实际内容进行比较,当前内容
这可以是一个简单的可变数组ivar,名为folderContents
,其中包含一组文件属性字典。您可以使用从NSFileManager
的-attributesFiteMatPath:error:
方法返回的词典或其子集
当收到文件夹通知时,您需要做的就是遍历存储的字典,检查是否添加、删除或修改了任何文件。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];
}
-(无效)setupWatchedFolder{
NSString*watchedFolder=@“/path/to/foo”;
NSMetadataQuery*query=[[NSMetadataQuery alloc]init];
[查询集搜索范围:@[watchedFolder]];
[query setPredicate:[NSPredicate predicateWithFormat:@“%K-LIKE'*.'',NSMetadataItemFSNameKey];
NSNotificationCenter*nc=[NSNotificationCenter defaultCenter];
[nc addObserver:自选择器:@selector(queryFoundStuff:)名称:NSMetadataQueryDifinishGatheringNotification对象:查询];
[nc addObserver:自选择器:@selector(queryFoundStuff:)名称:NSMetadataQueryIDUpdateNotification对象:查询];
[查询开始查询];
}
-(无效)queryFoundStuff:(NSNotification*)通知{
NSMetadataQuery*query=self.metadataQuery;
[查询禁用更新];
NSMutableArray*results=[NSMutableArray阵列容量:self.metadataQuery.resultCount];
对于(NSUInteger i=0;可能的kqueues副本将监视单个文件中的更改,但您必须自己为每个文件设置监视。UKKQueue
不太适合这种开箱即用的方式,因为它只允许一个代理。是否有其他方法可以根据需要监视文件夹?能否提供examp这是因为正如我所说,我是Cocoa应用程序开发新手。这似乎是个好主意,但我无法让它工作。QueryFoundStuff从未被调用。@MatthieuRiegler我已经更新了查询谓词以匹配我在应用程序中使用的内容。是否可以使用NSMetadataQuery+NSNotificationCenter仅获取操作(文件重命名、文件移动、文件添加)使用完整路径名,无需遍历整个关注的文件夹并映射到上一个文件夹快照?我尝试实现DirectoryWatcher,以便在关注的文件夹中删除、添加或重命名文件时通知其他代码部分。我希望发送action+filePath。您能给我一个提示吗?谢谢