您如何有效地检查 Cocoa 中的两个文件是否相同(具有相同的数据)?
上下文:我正在编写一个程序,它接收一个文件作为输入(输入文件)并将其复制到一个目录中。如果目录已经包含同名文件(同名文件),那么只有当同名文件不同时,才应使用新名称复制输入文件。
您如何有效地检查 Cocoa 中的两个文件是否相同(具有相同的数据)?
上下文:我正在编写一个程序,它接收一个文件作为输入(输入文件)并将其复制到一个目录中。如果目录已经包含同名文件(同名文件),那么只有当同名文件不同时,才应使用新名称复制输入文件。
你可以使用-[NSFileManager contentsEqualAtPath:andPath:]
.
从文档:
如果 path1 和 path2 是目录,则内容是每个包含的文件和子目录的列表——子目录的内容也会被比较。对于文件,这个方法检查它们是否是同一个文件,然后比较它们的大小,最后比较它们的内容。此方法不遍历符号链接,而是比较链接本身。
当贾斯汀回答我的问题时,我在NSFileWrapper
内部使用,所以我不能总是使用contentsEqualAtPath:andPath:
.
如果它可以帮助任何人,这是我写的比较 aNSFileWrapper
的内容和文件的内容:
- (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];
}
正如贾斯汀建议的那样,如果我无法重建文件包装器的路径,我只会使用上述方法。如果可以的话,我会使用contentsEqualAtPath:andPath:
.