2014-03-05 91 views
2

我試圖從應用程序包複製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); 
    } 

它產生以下錯誤:

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"); 
    } 

但它:

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,並試圖如下修改我的代碼後也不起作用。變量是NO。我試過的最後一件事是:

[data writeToFile:path atomically:YES]; 

但仍然徒勞。它返回NO

我需要注意的是,問題出現在設備上。在模擬器上它工作正常。 有人可以給我一個線索嗎?

回答

4

第一個例子是正確的一兩件事:

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

應該是:

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

這變得清晰,我們爲您閱讀錯誤消息,你看,它試圖將文件寫入/var/mobile/Applications/ACED3EF9-B0D8-49E8-91DE-37128357E509/Documents.themes.json。請注意,有一個.應該有/

stringByAppendingPathExtension:用於添加一個擴展到一個文件中,jpgtxthtml,.....

stringByAppendingPathComponent將文件添加到路徑,通過添加正確的目錄分隔符,你的情況下/

你的第二個例子肯定會失敗,因爲應用程序包是隻讀的。

+2

你拷貝了同樣的錯誤字符串兩次;) – Vladimir

+0

@AndreyChernukha對不起,複製過去的錯誤,我也添加了一些關於兩種方法之間的區別的解釋。 – rckoenes

+0

@rckoenes確實有效。非常感謝。我會在四分鐘內接受你的回答 –