2013-01-07 125 views
0

在我的游戏中,我将玩家的统计信息保存在存储在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!"); 
} 

请帮忙,我真的不明白有什么问题!我希望我已经让自己清楚了!

回答

0

使用文件路径而不是绝对路径。

+0

你能更具体吗? – RaphBlanchet

0

您的mac中可能存在重复项,这会使模拟器上的exists = true,而不是设备上。

最简单的检查方法是NSLog遇到的路径。请参阅these tools - 它们允许捕获控制台日志以获取设备上运行的发布版本。

0

您的文档目录很可能不存在 - 在模拟器上,您与Mac上的所有人共享文档目录;在设备上,每个人都有自己的目录。使用文件管理器方法

createDirectoryAtURL:url withIntermediateDirectories:YES 

确保该目录在您尝试写入之前存在。 (我倾向于使用URL方法而不是文件路径方法)。

PS。我建议让一个方法返回你想要的路径或url。不要一次又一次复制你的代码是一个好习惯。

0

我会做很多漂亮的,像在一个会话中的一切:

  1. 得到URL文件文件夹中的文件;
  2. 如果该文件尚未存在,则将该文件从复制到文档文件夹;

,应该是对的方法,我已经定义了一些宏,以避免在代码中错误输入该文件的名称:

- (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之后,您可以在没有任何问题的情况下恢复到文件,并且在运行时的其他时间点,您可以随时覆盖文件以方便您使用。


注:您可能需要扩展该代码更详细的错误处理,我把意见,只有当你需要担心潜在错误的地方。

相关问题