我正在尝试将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);
}
它会产生以下错误:
错误Domain = NSCocoaErrorDomain Code = 513“操作无法完成。(Cocoa错误513.)”UserInfo = 0x194a0e90 {NSSourceFilePathErrorKey = / var / mobile / Applications / ACED3EF9-B0D8-49E8-91DE-37128357E509 / Frinder .app / themes.json,NSUserStringVariant =( 复制 ),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“操作无法完成。操作不允许”}
搜索结束后,我发现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
。
我需要注意的是,问题只出现在设备上。在模拟器上它可以正常工作。 有人能给我一些线索吗?
答案 0 :(得分:4)
第一个例子是正确的:
[docDir stringByAppendingPathExtension:@"themes.json"];
应该是:
[docDir stringByAppendingPathComponent:@"themes.json"];
这一点很清楚我们您阅读了错误消息,您看到它尝试将文件写入/var/mobile/Applications/ACED3EF9-B0D8-49E8-91DE-37128357E509/Documents.themes.json
。请注意,.
应该有一个/
。
stringByAppendingPathExtension:
用于为文件添加扩展程序,jpg
,txt
,html
,.....
stringByAppendingPathComponent
会将一个文件添加到路径中,方法是添加正确的目录分隔符/
。
你的第二个例子肯定会失败,因为app bundle是readonly。