2009-05-03 58 views
5

我正在构建一个实用程序应用程序,用于跨Mac OSX的两个系统同步文件。我需要检测文件何时被重命名,但在其他情况下是相同的文件。我如何在可可中做到这一点?我如何检测文件是否已使用Cocoa重命名?

+0

好问题,但我怀疑有一种方法。 – 2009-05-03 00:07:54

+0

已经问及回答? http://stackoverflow.com/questions/645321/how-to-dectect-new-or-modified-files-in-mac-osx/645379#645379 – 2009-05-03 00:14:55

回答

3

没有简单的答案;您需要为您的应用找出最佳策略。

在一个简单的级别上使用文件系统编号。您可以使用NSFileSystemFileNumber来获取此信息。虽然可能使用FSRef,但工作可能更好。这是一个C API,但相对简单,并有一个与FSRefs进行比较的方法。

但是,有很多应用程序执行保存操作,替换磁盘上的文件,更改其文件编号。这可能会让你的代码烦躁不安。所以考虑使用别名。这是Finder用来跟踪别名文件目标的系统。使用别名管理器(C API)或其中一种开放源代码Objective-C包装(例如NDAlias或BDAlias)。别名将尽最大努力通过路径和文件号保持对文件的引用。

0

您可以查看inode号码(由NSFileManager返回的属性中的NSFileSystemFileNumber),它将涵盖简单的重命名情况。

1

了一些额外的细节,我遇到:

如果该文件只改名,那么该文件将保留相同的inode(NSFileSystemFileNumber)。

但是,如果文件被修改,Mac OS X将通常用新文件的副本替换旧文件,因此inode号码将不会相同。

如果您在TextEdit中编辑文本文件然后保存它,您可能会注意到文件消失并重新出现在Finder中。但是,如果您使用命令行编辑器(vi,pico,emacs等)编辑此文件,它将直接保存到文件中。

我的猜测是Cocoa应用程序会首先保存到临时文件,然后替换原始版本的文件,这就解释了为什么inode不同。

0

我假设你的目标是文件的内容,而不是他们的属性。最简单的方法是计算和比较散列。只要逐个读取两个文件并比较哈希值, G。与这些MD5例程。

0

如果您的源和目标位于不同平台/操作系统上,上述所有内容都将失败。最好的方法是获取源文件和目标位置中的新文件和丢失文件的列表,然后如果任何两个文件具有相同的大小?如果它们具有相同的大小比较校验和/ CRC,并且如果这是相同的,那么它们中的一个已经被重命名。