iPhone - при копировании файла из ресурсов в Documents выдается ошибка - PullRequest
8 голосов
/ 15 июля 2009

Я пытаюсь скопировать 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 я также создаю каталог "Файлы", и он возвращает YES.

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

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 ]

19 голосов
/ 14 октября 2009

EDIT:

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

1007 * Е.Г. *

[[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...

}

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

3 голосов
/ 15 июля 2009

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

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

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 / Документы

Вы можете прочитать больше на странице Файлов и сетей на сайте dev .

2 голосов
/ 15 июля 2009

Это NSFileWriteNoPermissionError:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...