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 中都已弃用,因此我不愿意基于它们构建解决方案。
我忽略了哪些其他方法?
- 别名记录的现代替代品是 NSURL 的”书签数据”API。
- 谢谢,肯!我会去阅读的。
- 出于好奇,您是否尝试过使用 NSURLDocumentIdentifierKey?对我来说,在优胜美地,它总是零!
- 我最终通过使用扩展文件属性解决了这个问题,如下所述。
我最终确定的解决方案是为我的应用程序触及的每个文件分配一个 UUID,该 UUID 存储在文件的扩展属性中,位于我的应用程序唯一的键下。移动或复制文件时,扩展属性会跟随文件。在读取目录结构时,我会检查每个文件的 UUID,如果不存在则分配一个。如果由于遇到文件副本而发生 UUID 冲突(我正在保存遇到的 UUID 的查找表),我会为后来遇到的文件分配一个新的 UUID。
NSHipster 关于扩展属性的文章
我在 NSURL 上的一个类别中封装了与 setxattr()、getxattr() 和 listxattr() 的杂乱 C 交互,这让我可以轻松地在 URL 指向的文件系统文档上查询/获取/设置任意文本属性。
来源:https://www.codenong.com/27493264/
