代码之家  ›  专栏  ›  技术社区  ›  Karl

iPhone保存升级时删除的数据?

  •  2
  • Karl  · 技术社区  · 14 年前

    下面是我用来加载和保存的代码,它在开发机器上运行良好。这样做不对吗?

    - (bool) saveData:(NSData*) data toFile:(NSString*) filename
    {
        NSError* error;
    
        NSFileManager *fileMgr = [[[NSFileManager alloc] init] autorelease];
        NSString *docsDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
        NSString* filePath = [docsDir stringByAppendingPathComponent:filename];
        NSString* validMarkerPath = [docsDir stringByAppendingPathComponent:[filename stringByAppendingString:@".val"]];
        NSString* backupPath = [docsDir stringByAppendingPathComponent:[filename stringByAppendingString:@".bak"]];
    
        // If the file exists and is marke valid, copy it over the backup.
        if([fileMgr fileExistsAtPath:filePath] && [fileMgr fileExistsAtPath:validMarkerPath])
        {
            if([fileMgr fileExistsAtPath:backupPath])
            {
                if(![fileMgr removeItemAtPath:backupPath error:&error])
                {
                    NSLog(@"Error: SafeFileManager: Could not remove backup file %@: %@", backupPath, [error localizedDescription]);
                }
            }
    
            if(![fileMgr moveItemAtPath:filePath toPath:backupPath error:&error])
            {
                NSLog(@"Error: SafeFileManager: Could not move %@ to %@: %@", filePath, backupPath, [error localizedDescription]);
            }
        }
    
        // Remove the "valid" marker file, if present.
        if([fileMgr fileExistsAtPath:validMarkerPath])
        {
            if(![fileMgr removeItemAtPath:validMarkerPath error:&error])
            {
                NSLog(@"Error: SafeFileManager: Could not remove validation file %@: %@", validMarkerPath, [error localizedDescription]);
            }
        }
    
        // Save the new file.
        if(![data writeToFile:filePath options:NSAtomicWrite error:&error])
        {
            NSLog(@"Error: SafeFileManager: Could not save to %@: %@", filePath, [error localizedDescription]);
            return NO;
        }
    
        // If we succeeded, save the "valid" marker file.
        NSData* markerData = [NSData dataWithBytes:"0" length:1];
        if(![markerData writeToFile:validMarkerPath options:NSAtomicWrite error:&error])
        {
            NSLog(@"Error: SafeFileManager: Could not save validation file %@: %@", validMarkerPath, [error localizedDescription]);
            return NO;
        }
        return YES;
    }
    
    - (NSData*) loadDataFromFile:(NSString*) filename
    {
        NSError* error;
    
        NSFileManager *fileMgr = [[[NSFileManager alloc] init] autorelease];
        NSString *docsDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
        NSString* filePath = [docsDir stringByAppendingPathComponent:filename];
        NSString* validMarkerPath = [docsDir stringByAppendingPathComponent:[filename stringByAppendingString:@".val"]];
    
        // If the file isn't valid, we'll try to load the backup.
        if(![fileMgr fileExistsAtPath:validMarkerPath])
        {
            filePath = [docsDir stringByAppendingPathComponent:[filename stringByAppendingString:@".bak"]];
        }
    
        NSData* data = nil;
    
        @try
        {
            data = [NSData dataWithContentsOfFile:filePath options:NSUncachedRead error:&error];
            if(nil == data)
            {
                NSLog(@"Error: SafeFileManager: Could not load from %@: %@", filePath, [error localizedDescription]);
            }
        }
        @catch (NSException * e)
        {
            NSLog(@"Error: SafeFileManager: Could not load from %@: %@", filePath, [e description]);
            data = nil;
        }
    
        return data;
    }
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   Karl    14 年前

    回答我自己的问题,这段代码确实有一个写孔,其中备份文件和标记文件被删除,这将导致加载失败。

    我现在选择了一种更简单的方法,如果不是更暴力的话,就是简单地保存文件,然后保存备份。加载时,它会尝试主文件,如果发生任何错误,它会使用备份文件尝试相同的加载例程。