2009-05-03 54 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,並且如果這是相同的,那麼它們中的一個已經被重命名。