如何检查是否存在相同的文件

时间:2013-11-15 23:11:52

标签: ios

我目前正在使用此代码复制我的SQLite数据库,但是目前只检查该文件是否存在...我想更改它以检查文件是否完全相同,例如我我担心如果数据库损坏或没有完全复制,应用程序将失去功能,解决此问题的唯一方法是删除应用程序并重新下载。

那么我如何比较两个文件是否完全相同?

- (void) copyDatabaseIfNeeded {


    //Using NSFileManager we can perform many file system operations.
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;

    NSString *dbPath = [self getDBPath];
    BOOL success = [fileManager fileExistsAtPath:dbPath];

    //NSLog(@"%d",success);

    if(!success) {

        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"database01.sqlite"];
        success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];

        if (!success)
            NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }
}

- (NSString *) getDBPath
{
    //Search for standard documents using NSSearchPathForDirectoriesInDomains
    //First Param = Searching the documents directory
    //Second Param = Searching the Users directory and not the System
    //Expand any tildes and identify home directories.

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    //NSLog(@"dbpath : %@",documentsDir);
    return [documentsDir stringByAppendingPathComponent:@"database01.sqlite"];
}

2 个答案:

答案 0 :(得分:4)

您可以使用contentsEqualAtPath:andPath: NSFileManager方法来实现此目的。 使用这样的代码:

......
if(!success) {
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"database01.sqlite"];
    success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];

    if (!success)
        NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);

   success = [fileManager contentsEqualAtPath:defaultDBPath andPath:dbPath]; //verify if file size and content matches
    if(!success) {
        //report error
    }
}
.......

它应该为你做到这一点。

答案 1 :(得分:1)

编辑 - 忘记这个答案 - 使用Ayan的那个。

首先比较文件大小。如果大小不同,您就知道文件不一样。这是一个简单快速的检查。

如果大小相同,则需要逐个字节地比较文件。一种效率低下的方法是将两个文件加载到NSData个对象中,看它们是否相等。这仅在文件总是足够小以适合内存时才有效。

更好的方法是将两个文件作为流打开并以块的形式读取它们。比较每个块(比如每个2k),直到两个块不同或者你到达终点。