检查Cocoa中的两个文件是否相同

时间:2012-08-28 18:42:20

标签: macos cocoa file-io nsfilemanager nsfilewrapper

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

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

2 个答案:

答案 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: