2009-07-15 3 views
8

Я пытаюсь скопировать mp3-файл из папки «Мои ресурсы» в папку внутри папки «Документы» приложения. На симуляторе это отлично работает. Но когда я запускаю его на устройстве, копирование файлов дает мне эту ошибкуiPhone - копирование файла из ресурсов в Документы дает ошибку

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, я также создание директории «Files» и возвращает 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) 

Вопрос

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

+0

Возможный дубликат: http://stackoverflow.com/questions/912828/how-do-i-fix-cocoa-error-513 – notnoop

+0

Увидел вопрос уже. Решение там не помогает моей проблеме – lostInTransit

+0

, возможно, это поможет, если вы можете включить код для копирования файла. – notnoop

ответ

19

EDIT:

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

E.g.

[[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]; 

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

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

}

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

+0

Спасибо Ларри. Застрял над этим слишком долго! – lostInTransit

+1

Возможно, оригинальная проблема заключается в том, что при попытке переместить файл вы попросите программу изменить свой ресурсный пакет (удалив его после копирования). Я не думаю, что ресурсный пакет может быть изменен на iPhone (но он может быть на Simulator). –

+0

Согласовано - хорошо суммировано Неван.Ключевой частью для меня было понимание того, что NSFileWriteNoPermissionError относится к исходному местоположению (пакет ресурсов), а не к месту назначения. Кроме того, в этой ситуации ошибка разрешения предотвращает обе части задачи перемещения - копию AND delete. – 2009-11-05 15:38:02

3

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

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

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

Путь к documentsDirectory на устройстве будет что-то вроде:

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

путь на тренажере будет что-то вроде:

/Объемы/Контактные/Поддержка пользователей/JohnDoe/Library/Application/iPhone Simulator/User/Applications/118086A0-FAAF-4CD4-9A0F-CD5E8D287270/Документы

Вы можете прочитать на странице Файл & Networking на dev site.

+0

Спасибо, Майкл. Я получаю правильный путь на устройстве. Я знаю, потому что я обращаюсь к другим файлам из той же папки, где я пытаюсь скопировать эти файлы без проблем. Я прочитал файлы и страницу n/w, прежде чем отправлять вопрос, но не смог найти ничего, что помогло бы мне решить проблему. – lostInTransit

2

Это NSFileWriteNoPermissionError:

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

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

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

+0

добавил исходный код в вопрос. спасибо – lostInTransit

+0

Хороший старт, выглядит хорошо до сих пор - можете ли вы также добавить результаты журнала (особенно src: dst: line) –

+0

У меня была аналогичная проблема, отлаживалась на час и удаляла и переустанавливала приложение, как вы предлагали, решил мою проблему !. Благодарю. – nacho4d

Смежные вопросы