关于objective C:如何确定 OS X 10.10 之前的应用会话之间的文件等效性?

How to determine file equivalency between app sessions prior to OS X 10.10?

我正在制作一个应用程序来监控对"热"文件夹的更改并将新文件上传到远程服务器(想想单向 Dropbox)。应用程序需要记住之前上传的文件,而不是重新上传它们,即使用户将它们移动到不同的子文件夹也是如此。如果我可以访问 10.10 API,我只需使用 NSURL 的 NSURLDocumentIdentifierKey 属性并称之为一天......但我需要支持回到 10.7 (Lion)。以下是我目前想到的方法,似乎都有些不足:

  • NSURLFileResourceIdentifierKey 但它不会在系统引导期间维护,因此它对于多个相同会话的使用无效。
  • 我可以为每个文件计算一个 MD5/SHA1 哈希,但是这个应用程序是针对专业照片用户的,所以对数百个数兆字节的图像文件进行哈希处理的前景并不吸引人。
  • Alias 框架和 FSRefs 在 10.8 中都已弃用,因此我不愿意基于它们构建解决方案。

我忽略了哪些其他方法?


我最终确定的解决方案是为我的应用程序触及的每个文件分配一个 UUID,该 UUID 存储在文件的扩展属性中,位于我的应用程序唯一的键下。移动或复制文件时,扩展属性会跟随文件。在读取目录结构时,我会检查每个文件的 UUID,如果不存在则分配一个。如果由于遇到文件副本而发生 UUID 冲突(我正在保存遇到的 UUID 的查找表),我会为后来遇到的文件分配一个新的 UUID。

NSHipster 关于扩展属性的文章

我在 NSURL 上的一个类别中封装了与 setxattr()、getxattr() 和 listxattr() 的杂乱 C 交互,这让我可以轻松地在 URL 指向的文件系统文档上查询/获取/设置任意文本属性。