下面是我用来加载和保存的代码,它在开发机器上运行良好。这样做不对吗?
- (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; }
回答我自己的问题,这段代码确实有一个写孔,其中备份文件和标记文件被删除,这将导致加载失败。
我现在选择了一种更简单的方法,如果不是更暴力的话,就是简单地保存文件,然后保存备份。加载时,它会尝试主文件,如果发生任何错误,它会使用备份文件尝试相同的加载例程。