【问题标题】:How to force finder sync extension to refresh visible items?如何强制查找器同步扩展刷新可见项目?
【发布时间】:2018-05-06 19:37:18
【问题描述】:

我有一个显示文件状态的 Finder 同步扩展 (FSE)。有没有办法强制 FSE 再次请求 Finder 窗口中当前可见的所有文件/文件夹的状态。

【问题讨论】:

  • 你要逼谁? Finder 向您的分机 (appex) 或您的应用程序的分机请求状态?因为第二个问题是您内部组织的问题(CFMessagePort 是一个解决方案)。
  • 我希望 Finder 刷新所有可见文件和文件夹的状态。 Afaik,你不能这样做,但我能做的(在答案中描述)是跟踪每个文件 Finder 请求的观察到的路径和缓存状态。然后,当 FSE 从主应用程序获取消息以刷新所有内容时,FSE 将简单地遍历所有仍在观察的缓存路径,并从应用程序请求每个路径的状态。此外,FSE 会删除它的内部 {path->status} 缓存(因为我使用分布式通知,FSE 会保留缓存状态以减少 FSE 和主应用程序之间的通信)。
  • “然后,当 FSE 从主应用程序获取消息以刷新所有内容时,FSE 将简单地遍历所有仍在观察的缓存路径,并从应用程序请求每个路径的状态。”您说的是来自应用程序的消息,但是 FSE 在收到此消息时如何刷新 Finder?
  • FSE 可以调用[[FIFinderSyncController defaultController] setBadgeIdentifier:syncStatus forURL:url],从而指示 Finder 更新给定 URL 的同步图标。
  • 非常感谢,这似乎是您问题的答案......您能否将其添加到您的答案中以支持您?顺便说一句,这总是对你有用吗?示例:High Sierra,使用 Finder 复制文件夹 - 它并不总是适用于新文件夹!

标签: findersync


【解决方案1】:

Finder 同步扩展 (FSE) 具有回调 beginObservingDirectoryAtURLendObservingDirectoryAtURL,您可以在其中跟踪正在观察的路径(即通过添加/删除到 NSMutableSet 的路径)。 此外,每当主应用程序通知 FSE 文件同步状态更新时,FSE 可以将接收到的状态缓存在字典中,其中文件路径映射到文件同步状态。

然后,当 FSE 收到来自主应用程序的刷新所有项目的消息时,FSE 应该检查正在观察哪些路径,然后从主应用程序请求新状态以获取所有在观察集中具有前缀的缓存路径。此外,FSE 应该删除它的内部缓存,强制它从主应用程序请求新观察到的文件(即当用户打开其他文件夹时)。

一旦 FSE 收到来自主应用程序的消息,它就可以调用 [[FIFinderSyncController defaultController] setBadgeIdentifier:syncStatus forURL:url] 从而为 URL 设置正确的同步状态图标。

此解决方案假定 FSE 和主应用程序之间的双向通信通道可以通过使用NSDistributedNotificationCenter 或通过CFMessagePort 来实现。

另外请记住,可以运行多个 FSE 实例(即来自第三个应用程序的保存对话框)

【讨论】:

  • 我想知道是否有办法强制查找器从查找器扩展(或任何机制)刷新其当前视图。基本上,我有一个远程数据源的挂载点,当目录中的远程添加了新文件时刷新查找器的方式是重播该文件系统操作,以便查找器刷新。不知道有没有其他方法。
  • @yijiem 嗯,是的,我以类似的方式进行操作。我也为此使用NSWorkspace. noteFileSystemChanged(path),但这似乎不适用于最新的 macOS Catalina。 Benjamin Fleischer 建议使用GMUserFileSystem.invalidateItemAtPath
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 2022-10-25
  • 2019-07-08
相关资源
最近更新 更多