我正在构建一个实用程序应用程序,用于跨Mac OSX的两个系统同步文件。我需要检测文件何时被重命名,但在其他情况下是相同的文件。我如何在可可中做到这一点?我如何检测文件是否已使用Cocoa重命名?
回答
没有简单的答案;您需要为您的应用找出最佳策略。
在一个简单的级别上使用文件系统编号。您可以使用NSFileSystemFileNumber
来获取此信息。虽然可能使用FSRef
,但工作可能更好。这是一个C API,但相对简单,并有一个与FSRefs进行比较的方法。
但是,有很多应用程序执行保存操作,替换磁盘上的文件,更改其文件编号。这可能会让你的代码烦躁不安。所以考虑使用别名。这是Finder用来跟踪别名文件目标的系统。使用别名管理器(C API)或其中一种开放源代码Objective-C包装(例如NDAlias或BDAlias)。别名将尽最大努力通过路径和文件号保持对文件的引用。
您可以查看inode号码(由NSFileManager返回的属性中的NSFileSystemFileNumber),它将涵盖简单的重命名情况。
了一些额外的细节,我遇到:
如果该文件只改名,那么该文件将保留相同的inode(NSFileSystemFileNumber)。
但是,如果文件被修改,Mac OS X将通常用新文件的副本替换旧文件,因此inode号码将不会相同。
如果您在TextEdit中编辑文本文件然后保存它,您可能会注意到文件消失并重新出现在Finder中。但是,如果您使用命令行编辑器(vi,pico,emacs等)编辑此文件,它将直接保存到文件中。
我的猜测是Cocoa应用程序会首先保存到临时文件,然后替换原始版本的文件,这就解释了为什么inode不同。
我假设你的目标是文件的内容,而不是他们的属性。最简单的方法是计算和比较散列。只要逐个读取两个文件并比较哈希值, G。与这些MD5例程。
如果您的源和目标位于不同平台/操作系统上,上述所有内容都将失败。最好的方法是获取源文件和目标位置中的新文件和丢失文件的列表,然后如果任何两个文件具有相同的大小?如果它们具有相同的大小比较校验和/ CRC,并且如果这是相同的,那么它们中的一个已经被重命名。
- 1. 检测文件是否重复,如果不是,则重命名
- 2. EmguCV:如何检测文件是否已达到使用
- 3. 如何使用jQuery检测文件上传是否已完成?
- 4. 如何使用AT命令检测“RING”是否已结束
- 5. 如何检查文件是否存在,并在Perl重命名
- 6. Subversion:检测重命名文件夹
- 7. 检测Excel文件是否已关闭
- 8. 检测文件是否已上传
- 9. 如何使用xslt重命名XML文件。我的代码是
- 10. 检查上传文件重命名前是否存在文件
- 11. 检查文件是否已签名
- 12. 我如何使用Cocoa的Accessibility API来检测窗口是否在前面?
- 13. 是否可以使用FTP命令重命名FTP文件夹?
- 14. 重命名文件是否已经在PowerShell中
- 15. 检测插件是否已被应用
- 16. 校验和检测重复文件和重命名文件
- 17. 如何检测使用microsoft.bat文件是否为空文件?
- 18. 如何使用java重命名文件
- 19. 如何使用Python重命名文件
- 20. 如何使用ajax重命名文件
- 21. 如何使用Node.js重命名文件
- 22. 如何使用wstring重命名文件?
- 23. 如何使用Perl重命名文件
- 24. 如何使用R重命名文件?
- 25. 如何使用os.walk()重命名文件?
- 26. 如何在Windows中检测文件重命名/移动
- 27. 如何检查文件是否是perl中的命名管道?
- 28. git如何检测类似的文件,因为它的重命名检测?
- 29. 检测文件名是否为空
- 30. 如何检测角度转换文件是否已加载
好问题,但我怀疑有一种方法。 – 2009-05-03 00:07:54
已经问及回答? http://stackoverflow.com/questions/645321/how-to-dectect-new-or-modified-files-in-mac-osx/645379#645379 – 2009-05-03 00:14:55