2011-03-13 68 views
0

在模拟器我可以一个NSMutableArray保存到一个文件,用下面的代码读回:保存的NSMutableArray到iPhone设备

NSFileManager *fileManager = [NSFileManager defaultManager]; 
    if ([fileManager fileExistsAtPath:@"RiskValues"]){ // If file exists open into table 
     NSLog(@"Risk Values File Exists"); 
     NSArray *paths = NSSearchPathForDirectoriesInDomains 
     (NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     NSString *fullFileName = [NSString stringWithFormat:@"RiskValues", documentsDirectory]; 
     gRiskValues = [[NSMutableArray alloc] initWithContentsOfFile:fullFileName]; 
     gRiskValuesAlreadyInitialised = YES; 
     } else {  
     NSLog(@"Can't find RiskValues file, so initialising gRiskValues table");    
     Do something else ....... 
     }  

这不会在设备上工作。我曾尝试使用下面找到该文件,但它仍然不能正常工作:

    NSString *fullFileName = [documentsDirectory [email protected]"RiskValues"]; 

我在做什么错?

每个人都很棒的答案。我已经解决了文件路径和存在问题。非常感谢。

回答

0

你必须在这里提供绝对路径:

if ([fileManager fileExistsAtPath:@"RiskValues"]) 

所以它必须是这样的:

 NSArray *paths = NSSearchPathForDirectoriesInDomains 
     (NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     NSString *fullFileName = [documentsDirectory stringByAppendingPathComponent:@"RiskValues"]; 

NSFileManager *fileManager = [NSFileManager defaultManager]; 
    if ([fileManager fileExistsAtPath: fullFileName]){ // If file exists open into table 
     NSLog(@"Risk Values File Exists"); 
     gRiskValues = [[NSMutableArray alloc] initWithContentsOfFile:fullFileName]; 
     gRiskValuesAlreadyInitialised = YES; 
     } else {  
     NSLog(@"Can't find RiskValues file, so initialising gRiskValues table");    
     Do something else ....... 
     } 
0
NSString *fullFileName = [NSString stringWithFormat:@"RiskValues", documentsDirectory]; 

这一行,你没有创建完整路径字符串的权利。你应该做的是

NSString *fullFileName = [documentsDirectory stringByAppendingPathComponent:@"RiskValues"]; 

也该检查

if ([fileManager fileExistsAtPath:@"RiskValues"]) 

绝不会在iOS上通过,因为它是不是你被允许在你的沙箱写任何地方的完整路径。我猜想它可以在模拟器上工作,因为在mac上它相对于HD根(或者其他东西,不知道mac文件系统是如何工作的:)),但是在iOS上,你将不得不给它一条路径到你的文件中的文件/目录(可能通过在其上附加@“RiskValues”或其他)

0

1)[NSString stringWithFormat:@"RiskValues", documentsDirectory]只是​​。所以这个名字指向应用程序目录中的文件。

2)[fileManager fileExistsAtPath:@"RiskValues"]在应用程序目录中搜索文件。它可以在模拟器中读取/写入(毕竟它在您的计算机文件系统中),但它在设备上是只读的。

BTW(NSFileManager Class Reference

试图谓词上的文件系统 或 文件系统上的特定文件的当前状态基于 行为不推荐。在 这样做会导致在文件系统竞态条件的情况下 奇怪的行为。这是 远不如尝试操作 (如加载一个文件或创建一个 目录),检查错误,并 妥善处理任何错误比它 尽量提前 弄清楚操作是否会成功。

解决方案:

1)不检查文件的存在。只是尽量让字典,initWithContentsOfFile:encoding:error:

2)你希望它是在文件目录中,以便构建这样

[documentsDirectory stringByAppendingPathComponent:@"RiskValues"]; 
路径