2012-08-28 41 views
4

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

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

回答

5

您可以使用-[NSFileManager contentsEqualAtPath:andPath:]

从文档:

如果路径1和路径2是目录,内容是子目录的每个包含,内容也比较的文件和子目录的列表。对于文件,这种方法检查它们是否是相同的文件,然后比较它们的大小,并最终比较它们的内容。此方法不会遍历符号链接,但会比较链接本身。

+0

谢谢!你知道是否有任何'contentsEqualAtPath:'等同于'NSFileWrapper'吗? – hpique

+0

@hpique不客气。没有我知道的 - 你需要记住或重建从你初始化它的源文件包装器(文件,目录)中的路径/ URL。 'NSFileWrapper'不需要镜像文件系统上的物理位置(明显的情况:它可以驻留在内存中)。所以只需找出一种方法来记住磁盘上的位置。如果你的'同名文件'的内容已经被加载(例如你的'NSFileWrapper'),这个过程可能会比你预期的要快,因为这个文件可能仍然在缓存中。当然,编写自己的代码不会太困难,要么是 – justin

+0

,而是先试着跟踪url,然后使用' - [NSFileManager contentsEqualAtPath:andPath:]'进行比较。这对于许多应用来说是足够的。 – justin

2

虽然贾斯汀回答我的问题,我是用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]; 
} 

贾斯汀建议,我只用上面的方法,如果我m无法重建文件包装的路径。如果可以的话,我使用contentsEqualAtPath:andPath:

相关问题