如何在cocoa中获取文件夹更改通知(文件夹监视程序)

如何在cocoa中获取文件夹更改通知(文件夹监视程序),cocoa,filesystemwatcher,fsevents,kqueue,Cocoa,Filesystemwatcher,Fsevents,Kqueue,我不熟悉Cocoa应用程序开发。我希望在修改给定目录下的任何文件时通知我的应用程序(文件夹监视程序)。修改意味着删除、添加、更改文件内容。我还尝试使用FSEvents和NSWorkspace的通知中心或代理消息,就像在UKKQueue中一样。当目录下的任何文件被修改时,我的应用程序收到通知。但问题是它没有给出被修改的特定文件的名称或路径。它给出目录的路径,但不给出特定文件的路径 你知道如何在特定文件中查看文件夹的修改吗???你必须编写代码来跟踪文件夹的内容,然后每当收到文件夹内容已更改的FSEv

我不熟悉Cocoa应用程序开发。我希望在修改给定目录下的任何文件时通知我的应用程序(文件夹监视程序)。修改意味着删除、添加、更改文件内容。我还尝试使用FSEvents和NSWorkspace的通知中心或代理消息,就像在UKKQueue中一样。当目录下的任何文件被修改时,我的应用程序收到通知。但问题是它没有给出被修改的特定文件的名称或路径。它给出目录的路径,但不给出特定文件的路径


你知道如何在特定文件中查看文件夹的修改吗???

你必须编写代码来跟踪文件夹的内容,然后每当收到文件夹内容已更改的
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。您能给我一个提示吗?谢谢