我如何检测文件是否已使用Cocoa重命名?

时间:2009-05-03 00:05:55

标签: cocoa macos

我正在构建一个实用程序应用程序,用于为Mac OSX跨两个系统同步文件。我需要检测文件何时被重命名,否则是同一个文件。我怎么在Cocoa中做到这一点?

5 个答案:

答案 0 :(得分:3)

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

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

但是,有很多应用程序通过替换磁盘上的文件来执行保存操作,并更改其文件编号。这可能会破坏您的代码。所以考虑使用别名。这与Finder用于跟踪别名文件目标的系统相同。使用Alias Manager(C API)或其中一个开源Objective-C包装器(例如NDAlias或BDAlias)。别名将尽力通过路径和文件号维护对文件的引用。

答案 1 :(得分:1)

我遇到的其他一些细节:

如果仅重命名文件,则该文件将保留相同的inode(NSFileSystemFileNumber)。

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我假设您的目标是文件的内容,而不是其属性。最简单的方法是计算和比较哈希值。只需逐块读取这两个文件并比较哈希值,例如: G。使用这些MD5例程。

答案 4 :(得分:0)

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