FileExistAtPath在模拟器上工作,但在设备上不工作
在我的游戏中,我将玩家的统计信息保存在存储在Documents目录中的plist中。我有一个应该保存的名为“Default_Stats.plist”的每个统计数据的空字典,以便如果这是第一次加载应用程序,它会将其复制到适当的目录中,以便随时加载和覆盖。问题是,每次我的应用程序加载时,它都不会识别“Stats.plist”并用默认统计信息覆盖它,重新设置玩家所做的每个统计信息......而且很奇怪,它完全适用于模拟器,但不在设备上。这里是我的代码:FileExistAtPath在模拟器上工作,但在设备上不工作
在这种方法我读的统计:
- (void) readStatsFromFile{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *statsPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Stats.plist"];
//Check if the file has already been created
if (![[NSFileManager defaultManager] fileExistsAtPath:statsPath]){
[self createStatsList];
}else{
stats = [[NSMutableDictionary dictionaryWithContentsOfFile:statsPath]retain];
}
}
这里是我的创建方法:
- (void) createStatsList{
NSString *statsPath = [[NSBundle mainBundle] bundlePath];
statsPath = [statsPath stringByAppendingPathComponent:@"Default_Stats.plist"];
stats = [[NSMutableDictionary dictionaryWithContentsOfFile:statsPath] retain];
[self writeStatsToFile];
}
而且我写方法:
- (void) writeStatsToFile{
BOOL ok;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *statsPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Stats.plist"];
ok = [stats writeToFile:statsPath atomically:YES];
if (!ok) {
NSLog(@"Couldn't write to file");
}else
NSLog(@"Stats written succesfully!");
}
请帮忙,我真的不明白有什么问题!我希望我已经让自己清楚了!
使用文件路径而不是绝对路径。
您的mac中可能存在重复项,这会使模拟器上的exists = true,而不是设备上。
最简单的检查方法是NSLog遇到的路径。请参阅these tools - 它们允许捕获控制台日志以获取设备上运行的发布版本。
您的文档目录很可能不存在 - 在模拟器上,您与Mac上的所有人共享文档目录;在设备上,每个人都有自己的目录。使用文件管理器方法
createDirectoryAtURL:url withIntermediateDirectories:YES
确保该目录在您尝试写入之前存在。 (我倾向于使用URL方法而不是文件路径方法)。
PS。我建议让一个方法返回你想要的路径或url。不要一次又一次复制你的代码是一个好习惯。
我会做很多漂亮的,像在一个会话中的一切:
- 得到
URL
在文件文件夹中的文件; - 如果该文件尚未存在,则将该文件从包复制到文档文件夹;
,应该是对的方法,我已经定义了一些宏,以避免在代码中错误输入该文件的名称:
- (NSURL *)statsFileURL {
#define NSStringFromFileNameWithExtension(filename, extension) [(filename) stringByAppendingPathExtension:(extension)]
#define kExtension @"plist"
#define kDefaultStatsFileName @"Default_Stats"
#define kCustomStatsFileName @"Stats"
NSURL *_returnURL = nil;
NSFileManager *_fileManager = [NSFileManager defaultManager];
NSURL *_documentDirectory = [[_fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *_myFileURLInDocumentFolder = [_documentDirectory URLByAppendingPathComponent:NSStringFromFileNameWithExtension(kDefaultStatsFileName, kExtension)];
if ([_fileManager fileExistsAtPath:[_myFileURLInDocumentFolder path]]) {
_returnURL = _myFileURLInDocumentFolder;
} else {
NSURL *_myFileURLInBundle = [[NSBundle mainBundle] URLForResource:kDefaultStatsFileName withExtension:kExtension];
if ([_fileManager fileExistsAtPath:[_myFileURLInBundle path]]) {
NSError *_error = nil;
if ([_fileManager copyItemAtURL:_myFileURLInBundle toURL:_myFileURLInDocumentFolder error:&_error]) {
if (_error == nil) {
_returnURL = _myFileURLInDocumentFolder;
} else {
// some error during copying
}
} else {
// some error during copying
}
} else {
// the file does not esixts at all, not even in the bundle
}
}
return _returnURL;
}
的URL
总是文档文件夹中指出,所以您将拥有对文件的读/写访问权限 - 如果发生某些错误,将会是nil
。
在您拥有URL
之后,您可以在没有任何问题的情况下恢复到文件,并且在运行时的其他时间点,您可以随时覆盖文件以方便您使用。
注:您可能需要扩展该代码更详细的错误处理,我把意见,只有当你需要担心潜在错误的地方。
你能更具体吗? – RaphBlanchet