2009-07-15 16 views
8

Próbuję skopiować plik mp3 z mojego folderu zasobów do folderu w folderze "Dokumenty" aplikacji. Na symulatorze działa to dobrze. Ale kiedy go uruchomić na urządzeniu, kopiowanie plików daje mi ten błądiPhone - kopiowanie pliku z zasobów do dokumentów powoduje błąd

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

źródło i docelowych ścieżki są w porządku, ale ja wciąż nie może skopiować pliku. Jakieś pomysły? Gdzie mogę dowiedzieć się, co oznacza kod błędu kakao 513?

Dzięki.

Oto odpowiedni kod źródłowy

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

Przed nawiązaniem połączenia do moveItemAtPath, ja również stworzenie katalogu „pliki” i zwraca Tak.

Oto dziennik wynika

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) 

Pytanie

Czy istnieje limit rozmiaru pliku przy kopiowaniu danych z zasobów do folderu dokumenty? Plik, który próbuję skopiować, ma około 5 MB. Czy to może być powód?

+0

możliwe dup: http://stackoverflow.com/questions/912828/how-do--ix-cocoa-error-513 – notnoop

+0

Widziałem już pytanie. Rozwiązanie tam nie pomoże mój numer – lostInTransit

+0

może to pomoże, jeśli możesz dołączyć kod do skopiowania pliku. – notnoop

Odpowiedz

19

EDIT:

Tylko zorientowali się jeszcze prostsze rozwiązanie.Zamiast moveItemAtPath: toPath: error :, po prostu użyj copyItemAtPath: toPath: error: ... ponieważ naprawdę chcemy skopiować plik z mainBundle i nie przenosić go. Powinienem był o tym wcześniej pomyśleć!

E.g.

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

Zobacz moje poprzednie komentarze poniżej o tym, dlaczego to działa.


Wierzę, że mam odpowiedź na to pytanie. Mogę powiedzieć na pewno, że problem nie jest ścieżką pliku docelowego.

byłem coraz ten sam błąd kakao 513 (NSFileWriteNoPermissionError) z prawie dokładnie ten sam kod:

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

Problem wydaje się, że plik, pochodzących z mainBundle, nie posiada odpowiednich uprawnień przenieść do innego miejsca. Nie jestem pewien, czy to polecenie, jeśli zostało wykonane, byłoby w rzeczywistości przenieść plik z głównejBundle lub po prostu skopiować to ... ale tak czy inaczej, menedżer plików nie podoba się pomysł.

Rozwiązanie jest proste: wystarczy wczytać plik mainBundle do obiektu NSData, a następnie zapisać NSData w nowym pliku. Zwróć uwagę, że ścieżka pliku docelowego jest taka sama w obu przykładach, co pokazuje nam, że lostInTransit ma rację mówiąc, że jego ścieżka do pliku jest OK.

W tym przykładzie, to poniższy kod będzie działać i nie rzucać się błąd:

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

BTW, w moim własnym kodzie, zamiast przechodzącą nil dla atrybutów :, skonfigurawac NSDictionary z atrybut NSFileModificationDate. Owinąłam także atrybut createFileAtPath: contents: atrybuty w instrukcji if-u przekazującej błędy. Innymi słowy,

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

}

Zajęło mi trochę czasu, aby dowiedzieć się tego wszystkiego, więc mam nadzieję, że to rozwiązanie będzie pomocne dla innych.

+0

Dzięki Larry. Utknąłem nad tym zbyt długo! – lostInTransit

+1

Być może pierwotny problem polega na tym, że przy próbie przeniesienia pliku prosi się program o zmianę pakietu zasobów (poprzez usunięcie go po skopiowaniu). Nie sądzę, aby pakiet zasobów mógł zostać zmieniony na iPhonie (ale może być na symulatorze). –

+0

Uzgodnione - dobrze podsumowano Nevan.Kluczową częścią było dla mnie stwierdzenie, że NSFileWriteNoPermissionError dotyczył lokalizacji źródłowej (pakietu zasobów), a nie docelowej lokalizacji. W tej sytuacji błąd uprawnień uniemożliwia także obie części zadania przenoszenia - kopię I usunięcie. –

3

Czy na pewno chcesz poprawnie przejść do folderu Dokumenty? Absolutna ścieżka w symulatorze różni się od bezwzględnej ścieżki na urządzeniu.

Należy użyć następujących czynności, aby upewnić się uzyskać poprawną ścieżkę do katalogu Dokumenty:

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

Ścieżka dla documentsDirectory na urządzeniu będzie coś takiego:

/var/mobile/Programy/30B51836-D2DD-43AA-BCB4-9D4DADFED6A2/Dokumenty

ścieżkę na symulatorze byłoby coś jak:

/Volumes/Stuff/obsługa Users/johndoe/Library/Application/iPhone Simulator/user/Applications/118086A0-FAAF-4CD4-9A0F-CD5E8D287270/Dokumenty

można przeczytać więcej na stronie pliku & Networking na dev site.

+0

Dzięki Michael. Dostaję poprawną ścieżkę na urządzeniu. Wiem, ponieważ mam dostęp do innych plików z tego samego folderu, w którym próbuję skopiować te pliki bez problemu. Przejrzałem pliki i stronę n/w przed opublikowaniem pytania, ale nie mogłem znaleźć niczego, co pomogłoby mi rozwiązać problem. – lostInTransit

2

To NSFileWriteNoPermissionError:

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

Jakoś masz złą drogę i to nie pozwalając piszesz tam. Możesz również usunąć aplikację i spróbować ponownie, na wypadek gdyby katalog dokumentów aplikacji był ustawiony na niewłaściwe uprawnienia ...

Powiedziałabym nam linię kodu wykonującą kopię i wydruki każdej zmiennej w tej linii. Wtedy możemy zobaczyć, jaki jest problem.

+0

dodał kod źródłowy do pytania. dzięki – lostInTransit

+0

Dobry start, wygląda na razie OK - czy możesz również dodać wyniki logu (szczególnie src: dst: line) –

+0

Miałem podobny problem, debugowałem przez godzinę i usunąłem i ponownie zainstalowałem aplikację, zgodnie z sugestią, rozwiązał mój problem !. dzięki. – nacho4d

Powiązane problemy