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

Posted

技术标签:

【中文标题】如何检测文件是不是已使用 Cocoa 重命名?【英文标题】:How I detect whether or not a file has been renamed using Cocoa?如何检测文件是否已使用 Cocoa 重命名? 【发布时间】:2009-05-03 00:05:54 【问题描述】:

我正在为 Mac OSX 构建一个跨两个系统同步文件的实用程序。我需要检测文件何时被重命名但其他文件是同一个文件。我如何在 Cocoa 中做到这一点?

【问题讨论】:

好问题,但我怀疑有办法。 已经问过并回答了吗? ***.com/questions/645321/… 【参考方案1】:

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

在一个简单的层面上,文件系统号是工作的。您可以使用NSFileSystemFileNumber 获取此信息。可能更好的工作是使用FSRef。它是一个 C API,但相对简单,并且具有与 FSRefs 比较是否相等的方法。

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

【讨论】:

【参考方案2】:

我遇到的一些其他细节:

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

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

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

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

【讨论】:

我有同样的问题,你能告诉我修改文件时唯一标识的替代解决方案吗?您也可以通过此链接给出答案:***.com/questions/30191016/…【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于如何检测文件是不是已使用 Cocoa 重命名?的主要内容,如果未能解决你的问题,请参考以下文章

linux中如何用rename命令重命名一个文件

如何将文件重命名为子目录

重命名文件时忽略错误 58

防止用户在从远程 ftp 服务器 cocoa 流式传输文件时重命名文件

如何从默认 Django 模型重命名模型字段?

重命名文件(如果已存在)-php 文件上传