我正在尝试将 json 文件从应用程序包复制到 Document 目录,但令人惊讶的是我无法做到这一点。代码如下:
NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [array lastObject];
NSString *path = [docDir stringByAppendingPathExtension"themes.json"];
if (![[NSFileManager defaultManager] fileExistsAtPath:path])
{
NSString *themesPath = [[NSBundle mainBundle] pathForResource"themes" ofType"json"];
NSError *error = nil;
[[NSFileManager defaultManager] copyItemAtPath:themesPath toPath:path error:&error];
if (error)
NSLog(@"Error %@", error);
}
它会产生以下错误:
Error Domain=NSCocoaErrorDomain Code=513 "The operation couldn’t be completed. (Cocoa error 513.)" UserInfo=0x194a0e90 {NSSourceFilePathErrorKey=/var/mobile/Applications/ACED3EF9-B0D8-49E8-91DE-37128357E509/Frinder.app/themes.json, NSUserStringVariant=(
Copy
), NSFilePath=/var/mobile/Applications/ACED3EF9-B0D8-49E8-91DE-37128357E509/Frinder.app/themes.json, NSDestinationFilePath=/var/mobile/Applications/ACED3EF9-B0D8-49E8-91DE-37128357E509/Documents.themes.json, NSUnderlyingError=0x194a0400 "The operation couldn’t be completed. Operation not permitted"}
经过搜索,我找到了 this question并尝试修改我的代码如下:
if (![[NSFileManager defaultManager] fileExistsAtPath:path])
{
NSString *themesPath = [[NSBundle mainBundle] pathForResource"themes" ofType"json"];
NSData *data = [NSData dataWithContentsOfFile:themesPath];
BOOL success = [[NSFileManager defaultManager] createFileAtPath:path contents:data attributes:nil];
if (!success)
NSLog(@"Fail");
}
但它也不起作用。 success 变量为 NO 。我尝试的最后一件事是:
[data writeToFile:path atomically:YES];
但还是徒劳。它返回 NO 。
我需要注意,问题仅出现在设备上。在模拟器上它工作得很好。
谁能给我一个线索?
Best Answer-推荐答案 strong>
第一个例子有一点是正确的:
[docDir stringByAppendingPathExtension"themes.json"];
应该是:
[docDir stringByAppendingPathComponent"themes.json"];
这很清楚我们您阅读了错误消息,您会看到它尝试将文件写入 /var/mobile/Applications/ACED3EF9-B0D8-49E8-91DE-37128357E509/Documents.themes.json 。注意有一个 . 应该有一个 / .
stringByAppendingPathExtension: 用于为文件添加扩展名,jpg 、txt 、html 、 .....
stringByAppendingPathComponent 将文件添加到路径中,通过添加正确的目录分隔符,您的大小写为 / 。
您的第二个示例肯定会失败,因为应用程序包是只读的。
关于ios - 无法写入文档目录,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/22194890/
|