Cocoa で 2 つのファイルが同じ (同じデータを持っている) かどうかを効率的にチェックするにはどうすればよいですか?
コンテキスト: ファイルを入力 (入力ファイル) として受け取り、それをディレクトリにコピーするプログラムを作成しています。ディレクトリに同じ名前のファイル (同名のファイル) が既に含まれている場合は、同名のファイルが異なる場合にのみ、入力ファイルを新しい名前でコピーする必要があります。
Cocoa で 2 つのファイルが同じ (同じデータを持っている) かどうかを効率的にチェックするにはどうすればよいですか?
コンテキスト: ファイルを入力 (入力ファイル) として受け取り、それをディレクトリにコピーするプログラムを作成しています。ディレクトリに同じ名前のファイル (同名のファイル) が既に含まれている場合は、同名のファイルが異なる場合にのみ、入力ファイルを新しい名前でコピーする必要があります。
使用できます-[NSFileManager contentsEqualAtPath:andPath:]
。
ドキュメントから:
path1 と path2 がディレクトリの場合、内容はそれぞれに含まれるファイルとサブディレクトリのリストです。サブディレクトリの内容も比較されます。ファイルの場合、このメソッドはそれらが同じファイルかどうかを確認し、次にサイズを比較し、最後に内容を比較します。このメソッドは、シンボリック リンクをトラバースしませんが、リンク自体を比較します。
ジャスティンが私の質問に答えている間、私はNSFileWrapper
社内で使用していたので、常に使用できるとは限りませんでしcontentsEqualAtPath:andPath:
た。
NSFileWrapper
それが誰かに役立つ場合に備えて、ファイルの内容と aの内容を比較するために私が書いたものは次のとおりです。
- (BOOL) contentsOfFileWrapper:(NSFileWrapper*)fileWrapper equalContentsAtPath:(NSString*)path {
NSDictionary *fileAttrs = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil];
NSUInteger fileSize = [attrs fileSize];
NSUInteger fileWrapperSize = [fileWrapper.fileAttributes fileSize]; // Will return zero if the file wrapper hasn't been written
if (fileWrapperSize > 0 && fileSize != fileWrapperSize) return NO;
NSData *fileData = [NSData dataWithContentsOfURL:fileURL];
NSData *fileWrapperData = fileWrapper.regularFileContents;
return [fileData isEqualToData:resourceData];
}
Justin が示唆したように、ファイル ラッパーのパスを再構築できない場合にのみ、上記の方法を使用しています。可能であれば、使用しますcontentsEqualAtPath:andPath:
。