如何有效地检查Cocoa中的两个文件是否相同(具有相同的数据)?
上下文:我正在编写一个程序,它接收一个文件作为输入(输入文件)并将其复制到一个目录中。如果目录已包含具有相同名称的文件(同名文件),则只有在同名文件不同时才应使用新名称复制输入文件。
答案 0 :(得分:6)
您可以使用-[NSFileManager contentsEqualAtPath:andPath:]
。
来自文档:
如果path1和path2是目录,则内容是文件列表和子目录,每个子目录也包含子目录的内容。对于文件,此方法检查它们是否是同一文件,然后比较它们的大小,最后比较它们的内容。此方法不会遍历符号链接,而是比较链接本身。
答案 1 :(得分:3)
当Justin回答我的问题时,我在内部使用了NSFileWrapper
因此我无法始终使用contentsEqualAtPath:andPath:
。
如果它对任何人都有帮助,我写这篇文章是为了将NSFileWrapper
的内容与文件内容进行比较:
- (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:
。