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
:
Почему-то у вас неправильный путь, и он не позволяет вам писать там. Вы также можете удалить приложение и повторить попытку, если каким-то образом в вашем каталоге документов приложения установлены неправильные разрешения...
Я дал бы нам строку кода, выполняющую копирование, и распечатывал каждую переменную, используемую в этой строке. Тогда мы можем увидеть, в чем проблема.