iPhone - при копировании файла из ресурсов в Documents выдается ошибка

Я пытаюсь скопировать mp3-файл из папки Resources в папку внутри папки "Documents" приложения. На симуляторе это работает нормально. Но когда я запускаю его на устройстве, копирование файлов дает мне эту ошибку

Operation could not be completed. (Cocoa error 513.)

Пути источника и назначения в порядке, но я все еще не могу скопировать файл. Есть идеи? Где я могу узнать, что означает код ошибки какао 513?

Благодарю.

Вот соответствующий исходный код

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *folderPath = [documentsDirectory stringByAppendingPathComponent:@"Files"];

    NSString *insPath = [NSString stringWithFormat:@"%@.mp3", fileName];
    NSString *srcPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:insPath];
    NSString *destPath = [folderPath stringByAppendingPathComponent:insPath];
    NSLog(@"Src: %@, Dest: %@", srcPath, destPath);

    NSError *err;
    [fileManager moveItemAtPath:srcPath toPath:destPath error:&err];

    NSLog(@"Err desc-%@", [err localizedDescription]);
    NSLog(@"Err reason-%@", [err localizedFailureReason]);

Перед вызовом moveItemAtPath я также создаю каталог "Файлы", и он возвращает ДА.

Вот результаты журнала

Src: /var/mobile/Applications/512D7565-7EF7-4C13-A015-19EEC3F3B465/MyApp.app/MyFile.mp3, Dest: /var/mobile/Applications/512D7565-7EF7-4C13-A015-19EEC3F3B465/Documents/Files/MyFile.mp3

Err desc-Operation could not be completed. (Cocoa error 513.)
Err reason-(null)

Вопрос

Существует ли ограничение на размер файла при копировании данных из ресурсов в папку "Документы"? Файл, который я пытаюсь скопировать, составляет около 5 МБ. Может ли это быть причиной?

3 ответа

Решение

РЕДАКТИРОВАТЬ:

Просто разобрался с еще более простым решением. Вместо moveItemAtPath:toPath:error: просто используйте copyItemAtPath:toPath:error: ..., поскольку мы действительно хотим скопировать файл из mainBundle, а не перемещать его. Я должен был подумать об этом раньше!

Например

[[NSFileManager defaultManager] copyItemAtPath:mainBundleFilePath 
                                        toPath:destPath 
                                         error:&err]

Смотрите мои предыдущие комментарии ниже о том, почему это работает.


Я считаю, что у меня есть ответ на этот вопрос. Я могу точно сказать, что проблема не в пути к файлу назначения.

Я получаю ту же ошибку Какао 513 (NSFileWriteNoPermissionError) с почти таким же кодом:

[[NSFileManager defaultManager] moveItemAtPath:mainBundleFilePath 
                                        toPath:destPath 
                                         error:&err]

Проблема заключается в том, что файл, полученный из mainBundle, не имеет подходящих разрешений для перемещения в другое место. Я не уверен, что если эта команда, если она будет выполнена, на самом деле переместит файл из mainBundle или просто скопирует его... но в любом случае, файловому менеджеру не нравится эта идея.

Решение простое: просто прочитайте файл mainBundle в объект NSData, а затем запишите NSData в новый файл. Обратите внимание, что путь к файлу назначения одинаков в обоих примерах, что показывает нам, что lostInTransit правильно сказал, что его путь к файлу в порядке.

В этом примере следующий код будет работать, а не выдавать ошибку:

NSData *mainBundleFile = [NSData dataWithContentsOfFile:mainBundleFilePath];
[[NSFileManager defaultManager] createFileAtPath:destPath 
                                        contents:mainBundleFile 
                                      attributes:nil];

Кстати, в моем собственном коде вместо передачи nil для атрибутов: я настроил NSDictionary с атрибутом NSFileModificationDate. Я также обернул атрибуты createFileAtPath:contents: в ошибку, передающую оператор if. Другими словами,

if (![[NSFileManager defaultManager] createFileAtPath:destPath 
                                             contents:mainBundleFile 
                                           attributes:myAttributes]) { 
 // handle error as necessary, etc...

}

Мне потребовалось некоторое время, чтобы понять все это, так что, надеюсь, это решение будет полезно для других.

Вы уверены, что правильно получаете путь к папке "Документы"? Абсолютный путь в симуляторе отличается от абсолютного пути на устройстве.

Вы должны использовать следующее, чтобы убедиться, что вы получите правильный путь к каталогу документов:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

Путь для DocumentsDirectory на устройстве будет что-то вроде:

/ VAR / мобильные / Применения /30B51836-D2DD-43AA-BCB4-9D4DADFED6A2/ Документы

Путь на симуляторе будет примерно таким:

/ Тома / Разное / Пользователи /johnDoe/ Библиотека / Поддержка приложений /iPhone Simulator/ Пользователь / Приложения /118086A0-FAAF-4CD4-9A0F-CD5E8D287270/ Документы

Вы можете прочитать больше на странице File & Networking на сайте разработчика.

Это NSFileWriteNoPermissionError:

http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference.html

Почему-то у вас неправильный путь, и он не позволяет вам писать там. Вы также можете удалить приложение и повторить попытку, если каким-то образом в вашем каталоге документов приложения установлены неправильные разрешения...

Я дал бы нам строку кода, выполняющую копирование, и распечатывал каждую переменную, используемую в этой строке. Тогда мы можем увидеть, в чем проблема.

Другие вопросы по тегам