5

您如何有效地检查 Cocoa 中的两个文件是否相同(具有相同的数据)?

上下文:我正在编写一个程序,它接收一个文件作为输入(输入文件)并将其复制到一个目录中。如果目录已经包含同名文件(同名文件),那么只有当同名文件不同时,才应使用新名称复制输入文件。

4

2 回答 2

6

你可以使用-[NSFileManager contentsEqualAtPath:andPath:].

从文档:

如果 path1 和 path2 是目录,则内容是每个包含的文件和子目录的列表——子目录的内容也会被比较。对于文件,这个方法检查它们是否是同一个文件,然后比较它们的大小,最后比较它们的内容。此方法不遍历符号链接,而是比较链接本身。

于 2012-08-28T19:04:55.087 回答
3

当贾斯汀回答我的问题时,我在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:.

于 2012-08-29T08:13:35.527 回答