无法写入文档目录

时间:2014-03-05 10:21:31

标签: ios objective-c nsfilemanager

我正在尝试将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

我需要注意的是,问题只出现在设备上。在模拟器上它可以正常工作。  有人能给我一些线索吗?

1 个答案:

答案 0 :(得分:4)

第一个例子是正确的:

[docDir stringByAppendingPathExtension:@"themes.json"];

应该是:

[docDir stringByAppendingPathComponent:@"themes.json"];

这一点很清楚我们您阅读了错误消息,您看到它尝试将文件写入/var/mobile/Applications/ACED3EF9-B0D8-49E8-91DE-37128357E509/Documents.themes.json。请注意,.应该有一个/

stringByAppendingPathExtension:用于为文件添加扩展程序,jpgtxthtml,.....

stringByAppendingPathComponent会将一个文件添加到路径中,方法是添加正确的目录分隔符/

你的第二个例子肯定会失败,因为app bundle是readonly。