Cocoa、FSEvents、kFSEventStreamCreateFlagFileEvents 标志和“重命名”事件

2023-12-30

我一直在玩FSEvents在我的一个小应用程序中,将我的应用程序的内容与硬盘驱动器上的内容同步(基本上,它是一个小图像查看器,我希望它的内容在硬盘驱动器内容更改时更新)

我使用创建我的流kFSEventStreamCreateFlagFileEvents标志,但我很难弄清楚操作系统(或内核,或其他什么)如何生成这些事件,不幸的是,没有关于使用此标志生成的事件的文档...似乎它们是 10.7 的新功能,并且仍然没有记录。

所以,我的主要问题是“重命名”。当我进行简单的重命名时,2 个 kFSEventStreamEventFlagItemRenamed 事件将发送到我的回调。第一个包含旧文件名,第二个包含新文件名。当您重命名一批文件时会出现问题,这些事件可能不是连续的。例如,有以下情况:

  1. “文件1”->“新文件_1”
  2. “文件2”->“新文件_2”

我可能会按以下顺序收到事件:

  1. “重命名”/“文件1”
  2. “重命名”/“文件2”
  3. “重命名”/“new_file_1”
  4. “重命名”/“new_file_2”

当你捕获第二个重命名事件时,似乎没有任何方法可以获取第一个重命名事件的 id ...所以我所做的是:当接收到“重命名”事件时,我使用 stat() 执行文件名。如果stat成功返回,则意味着它是新的文件名。如果没有,就说明是旧的了。我仍然无法链接这两个事件,但至少我可以通过删除旧文件并添加新文件来解决问题。

所以,我基本上有两个问题:

第一个是:我是否完全盲目,没有看到通过 fsevents 正确捕获“重命名”事件的明显方法?

第二个我:我有时会遇到一个奇怪的错误,不是只发送 2 个重命名事件,而是发送 3 个!所以我得到了一个文件添加了两次...我不确定这是否是一个错误,或者这是否来自于我完全错误地使用 fsevent API 和kFSEventStreamCreateFlagFileEvents旗帜 ...

欢迎任何帮助,我完全没有办法解决这个问题!


您需要使用该标志kFSEventStreamCreateFlagUseExtendedData(自 OS X 10.13 起可用)。使用该标志创建的流将包括inode事件文件的。这样您就可以检测在报告的事件批次中发生的“重命名链”。

附: macOS 可能会为新创建的文件重用已删除文件的索引节点,但如果您立即处理事件,则风险可以忽略不计。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cocoa、FSEvents、kFSEventStreamCreateFlagFileEvents 标志和“重命名”事件 的相关文章

  • 如何在 Objective-C + Cocoa 中创建自定义无边框 NSWindow?

    首先我要说的是 这是我的第一个真正的 Cocoa 应用程序 这是一个简单的应用程序 几乎在无边框窗口中显示我的网站 我目前创建无边框窗口的方式使用以下内容 void awakeFromNib window setStyleMask NSBo
  • 为什么这段代码不能产生正确的输出? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 给定一个字符串和一个数字 该函数将从
  • NSRunningApplication - 终止

    我将如何使用NSRunningApplication 我有与启动应用程序相反的东西 NSWorkspace sharedWorkspace launchApplication appName 但我想关闭一个 当我调试代码时出现错误NSRun
  • 获取选定行 NSTableView 的值

    我如何获取 NSTableView 中选定行的值 通过使用selectedRow see here https developer apple com documentation appkit nstableview 1535010 sel
  • iCloud Drive 内用户选择的文件夹内的垃圾文件

    我的应用程序可在任何用户选择的文件夹内处理用户 txt 文件 创建 更改 删 除 我只是在内部存储书签以访问用户选择的文件夹和文件 现在 在 macOS Catalina 中 当源文件夹位于 iCloud Drive 内时 系统仍然允许我创
  • 如何构建 Objective-C 静态库? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一些 Objective C 类 目前在 Cocoa 应用程序 Mac OS X 和 Cocoa Touch 应用程序 iOS 中
  • 如何在 Cocoa with Core Data 中上传和存储文件?

    我有一个应用程序 我希望能够将文件上传到其中 我可以想象序列化数据 将其放入数组中 然后序列化数组并将其放入核心数据中 但这似乎不太正确 我还可以想象将文件复制到应用程序的支持文件中 获取这些文件的 NSURL 并存储数组或 NSURL 无
  • C# 或 Windows 相当于 OS X 的 Core Data?

    我迟到了 现在才开始在 OS X Cocoa 中使用 Core Data 它令人难以置信 并且确实改变了我看待事物的方式 C 或现代 Windows 框架中是否有等效的技术 即拥有可免费保存 数据管理 删除 搜索的托管数据类型 还想知道Li
  • 使用 Python 查找 Mac OS X 中的当前活动窗口

    有没有办法使用 Python 在 Mac OS X 上查找给定时间当前活动窗口的应用程序名称 这应该有效 usr bin python from AppKit import NSWorkspace activeAppName NSWorks
  • 如何自定义 NSSlider

    我正在尝试在 Cocoa 中实现一个具有 5 个值的自定义滑块 查看我的演示项目 可以在此处下载 http s000 tinyupload com index php file id 07311576247413689572 http s0
  • 使用 Nib 实现国际化。这真的是个好主意吗?

    在苹果文档中 他们说笔尖只需将笔尖翻译成多种语言即可实现国际化 我现在正在考虑一个更糟糕但现实的场景 你已经制作了一个巨大的用户界面 然后你将其翻译成 25 种语言 所以你会得到 25 个不同的笔尖 您还会在样式和定义 UI 方面获得巨大的
  • 如何等待 webViewDidFinishLoad 完成

    我有一个初始化 webView 的布尔条件 并在 webViewDidFinishLoad 中加载另一个委托 以便在完成完成后触发 但是 由于布尔值在条件 webViewDidFinishLoad 之前返回 因此页面永远不会完全加载 如何确
  • “内容值”和“内容对象”有什么区别

    我现在正在探索绑定 并且有一个 NSPopUpButton 它为我提供了 值选择 下的许多绑定选项 Content Content Objects Content Values 然后Selected Object Selected Valu
  • 如何在可可中使用核心动画对 png 序列进行动画处理(非触摸)

    我想在 NSImageView 中对 png 序列进行动画处理 但我无法使其工作 它只是不想显示任何动画 有什么建议吗 这是我的代码 void imageAnimation NSMutableArray iconImages NSMutab
  • 可可:NSView原点x在底部

    我正在以编程方式创建一个NSWindow以及其上的控件 看来原点 0 0 位于左下角 这对我来说很奇怪 来自其他 GUI 工具包 是否有一些标志 以便我可以更改它 使原点位于左上角 在 OS X 上 原点位于左下角 对于屏幕坐标和视图框架来
  • 如何将 Cocoa 应用程序移植到 iPhone-OS?

    我即将创建一个 Cocoa 应用程序 我想确保有一天我可以轻松地将它移植到 iPad 甚至 iPhone 我该如何提前计划 我知道我将不得不重做所有 NIB 并可能设计一个不同的工作流程 但是代码呢 仅仅用 UIsomething 替换每个
  • Xcode 愚蠢警告:视图正在裁剪其内容

    我在 Xcode 4 中收到这个愚蠢的警告 Clipped Content View is clipping its content 如果我创建一个无边框斜角按钮 其图像大于按钮本身 为什么 我怎样才能抑制它 我也遇到了类似的灰色警告问题
  • NS_ENUM 和 NS_OPTIONS 有什么区别?

    我在 Xcode5 中用 clang 预处理了以下代码 typedef NS ENUM NSInteger MyStyle MyStyleDefault MyStyleCustom typedef NS OPTIONS NSInteger
  • 转换任何对象?到字符串

    我有一个返回 AnyObject 的函数 func aFunction param String gt AnyObject 如何将其转换为字符串 和字符串 尝试这个 if let result aFunction test as Strin
  • 如何让程序在登录时自动启动?

    如何设置菜单栏应用程序在登录时自动启动 我希望这是默认的 我可以简单地通过在 info plist 中添加一个 bool 来做到这一点吗 此解决方案仅适用于非沙盒应用程序 LSSharedFile此解决方案中使用的功能仅适用于非沙盒应用程序

随机推荐