访问和使用应用程序沙箱中的文件

时间:2014-07-09 14:44:49

标签: ios sandbox

我有一个iOS应用程序,我从远程服务器下载一些文件并将它们存储在应用程序沙箱目录Documents中。我确信文件正确保存在沙盒中,因为当我运行以下代码时:

NSFileManager* fileManager = [NSFileManager defaultManager];
NSString* documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSError* error;
NSLog(@"%@",[fileManager contentsOfDirectoryAtPath:documentPath error:&error]);

我得到以下输出:

2014-07-09 17:39:07.768 Sample[13413:60b] (
    "test.json",
    "test.png"
)

但是,我无法在Documents目录中访问这些文件。我尝试使用以下代码获取test.json的内容:

NSString* testJsonDir = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"json"];
NSString* testJson = [NSString stringWithContentsOfFile:testJsonDir encoding:NSUTF8StringEncoding error:&error];

这会将testJsonDir返回为nil,并在代码为258时出错。还有其他方法可以执行此操作吗?

2 个答案:

答案 0 :(得分:1)

[NSBundle pathForResource:ofType:]将在应用包中找到文件,而不是文档文件夹。

你想:

NSString *testJsonDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *testJsonFile = [testJsonDir stringByAppendingPathComponent:@"test.json"];
NSString *testJson = [NSString stringWithContentsOfFile:testJsonFile
                                               encoding:NSUTF8StringEncoding
                                                  error:&error];

答案 1 :(得分:1)

[NSBundle mainBundle]指的是.app包,而不是Documents目录。要访问test.json,请使用:

NSError *error = nil;
NSURL *documentsUrl = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0];
NSString *testJson = [NSString stringWithContentsOfURL:[documentsUrl URLByAppendingPathComponent:@"test.json"] encoding:NSUTF8StringEncoding error:&error];

我使用-URLsForDirectory:inDomains:代替NSSearchPathForDirectoriesInDomains()因为前者是首选方式。