Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检测文件是否已使用Cocoa重命名?_Cocoa_Macos - Fatal编程技术网

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

如何检测文件是否已使用Cocoa重命名?,cocoa,macos,Cocoa,Macos,我正在为MacOSX构建一个实用程序应用程序,用于在两个系统之间同步文件。我需要检测一个文件何时被重命名,但在其他方面是同一个文件。如何在Cocoa中做到这一点?您可以查看inode编号(NSFileManager返回的属性中的NSFileSystemFileNumber),它将涵盖简单的重命名情况。没有简单的答案;你需要为你的应用找出最好的策略 在一个简单的层次上,就是使用文件系统号。您可以使用NSFileSystemFileNumber获取此信息。不过,使用FSRef可能会更好。它是一个C

我正在为MacOSX构建一个实用程序应用程序,用于在两个系统之间同步文件。我需要检测一个文件何时被重命名,但在其他方面是同一个文件。如何在Cocoa中做到这一点?

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

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

在一个简单的层次上,就是使用文件系统号。您可以使用
NSFileSystemFileNumber
获取此信息。不过,使用
FSRef
可能会更好。它是一个C API,但相对简单,并且有一种方法可以与FSRefs进行比较以获得相等性


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

我遇到的几个其他详细信息:

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

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

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


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

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

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

问得好,但我怀疑是否有办法。是否已询问并回答?我有同样的上述问题,你能告诉我当文件被修改时唯一标识的替代解决方案吗??您也可以通过此链接给出答案: