【问题标题】:How to get folder changes notifications(folder watcher) in cocoa如何在可可中获取文件夹更改通知(文件夹监视程序)
【发布时间】:2011-12-19 13:48:02
【问题描述】:

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

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

【问题讨论】:

  • kqueues 将监控单个文件的更改,但您必须自己设置每个文件的监控。 UKKQueue 不能很好地开箱即用,因为它只允许单个委托。
  • 有没有其他方法可以按照我的要求观看文件夹??

标签: cocoa filesystemwatcher fsevents kqueue


【解决方案1】:

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

这可以像一个可变数组 ivar 一样简单,命名为 folderContents,其中包含一组文件属性字典。您可以使用从NSFileManager-attributesOfItemAtPath:error: 方法返回的字典或其子集。

当您收到文件夹通知时,您需要做的就是遍历存储的字典并检查是否添加、删除或修改了任何文件。 NSFileManager 属性字典包含执行此操作所需的所有信息。

然后,您需要使用更新后的信息更新有关文件夹的存储信息。

【讨论】:

  • 你能给我提供示例代码吗,因为正如我所说,我是 Cocoa 应用程序开发的新手。
【解决方案2】:

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];
}

【讨论】:

  • 这似乎是个好主意,但我无法实现。 QueryFoundStuff 永远不会被调用。
  • @MatthieuRiegler 我已更新查询谓词以匹配我在应用程序中使用的内容
  • 是否可以使用 NSMetadataQuery + NSNotificationCenter 来获得具有完整路径名的操作(文件重命名、文件移动、文件添加),而无需遍历整个监视文件夹并映射到最后一个文件夹快照?我尝试实现 DirectoryWatcher 以在监视文件夹中删除或添加或重命名文件时通知其他代码部分。我喜欢发送action+filePath。你能给我一个提示吗?谢谢
猜你喜欢
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 2012-03-26
  • 2012-07-24
相关资源
最近更新 更多