2012-02-20 21 views
5

Próbuję przenieść folder z plikiem do folderu tymczasowego, ale zawsze pojawia się ten sam błąd: Nie można ukończyć operacji. (Błąd kakao 516.)Dziwny błąd podczas przenoszenia folderu do temp za pomocą metody moveItemAtPath. Błąd kakao 516

To jest kod, widzisz coś dziwnego? Z góry dziękuję.

// create new folder 
NSString* newPath=[[self getDocumentsDirectory] stringByAppendingPathComponent:@"algo_bueno"]; 
NSLog(@"newPath %@", newPath); 
if ([[NSFileManager defaultManager] fileExistsAtPath:newPath]) { 
    NSLog(@"newPath already exists."); 
} else { 
    NSError *error; 
    if ([[NSFileManager defaultManager] createDirectoryAtPath:newPath withIntermediateDirectories:YES attributes:nil error:&error]) { 
     NSLog(@"newPath created."); 
    } else { 
     NSLog(@"Unable to create directory: %@", error.localizedDescription); 
     return; 
    } 
} 

// create a file in that folder 
NSError *error; 
NSString* myString=[NSString stringWithFormat:@"Probando..."]; 
NSString* filePath=[newPath stringByAppendingPathComponent:@"myfile.txt"]; 
if ([myString writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error]) { 
    NSLog(@"File created."); 
} else { 
    NSLog(@"Failed creating file. %@", error.localizedDescription); 
    return; 
} 

// move this folder and its folder 
NSString *tmpDir = NSTemporaryDirectory(); 
NSLog(@"temporary directory, %@", tmpDir); 
if ([[NSFileManager defaultManager] moveItemAtPath:newPath toPath:tmpDir error:&error]) { 
    NSLog(@"Movido a temp correctamente"); 
} else { 
    NSLog(@"Failed moving to temp. %@", error.localizedDescription); 
} 

Odpowiedz

13

Błąd 516 jest NSFileWriteFileExistsError

Nie można przenieść plik do miejsca, gdzie już istnieje plik :)

(patrz Dokumentacja tutaj - https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference.html i szukaj '516')


Bardziej użytecznie, docelowa ścieżka powinna być nazwą pliku, a nie folderem. Spróbuj tego:

// move this folder and its folder 
NSString *tmpDir = NSTemporaryDirectory(); 
NSString *tmpFileName = [tmpDir stringByAppendingPathComponent:@"my-temp-file-name"]; 
NSLog(@"temporary directory, %@", tmpDir); 
if ([[NSFileManager defaultManager] moveItemAtPath:newPath toPath:tmpFileName error:&error]) { 
    NSLog(@"Movido a temp correctamente"); 
} else { 
    NSLog(@"Failed moving to temp. %@", error.localizedDescription); 
} 
+0

Dzięki za odpowiedź! Zapomniałem powiedzieć, że pracuję dla platformy iOS, chociaż dokument i kod błędu są takie same, jeśli zmienisz URL "mac" przez "ios". Próbowałem, co powiedziałeś, usuwając moją aplikację z mojego symulatora i urządzenia (tak, temp dir jest pusty) i mówi 516. O tym, co mówisz o pliku, w dokumentach, które mogę przeczytać: "moveItemAtPath: toPath: error: Przenosi plik lub katalog o określonej ścieżce do nowej lokalizacji synchronicznie " Czy znasz inny sposób przenoszenia folderu do folderu tmp? Kategoria lub biblioteka? Dzięki! – Ricardo

+0

Nawiasem mówiąc, twój kod działa, ale przenosi tylko plik, ale wolę przenieść folder pełen plików. Dowolny pomysł? Być może przy użyciu rekursji, ale chciałem tylko przenieść folder, ponieważ usunięcie folderu (lub skopiowanie pliku według pliku) zajmuje kilka sekund (jest wiele plików, około 500 MB). Czy masz pomysł lub sugestię? Bardzo dziękuję za Twoją pomoc. – Ricardo

+0

Powinien działać, jeśli po prostu przekazujesz ścieżkę do folderu zamiast ścieżki do pliku, np. Zamiast tylko 'newPath' użyj' [newPath stringByDeletingLastPathComponent] ', aby uzyskać folder, w którym znajduje się nowy plik? – deanWombourne

2

uzyskać unikalną nazwę folderu temp stosując następujące metody:

NSFileManager unique file names

CFUUIDRef uuid = CFUUIDCreate(NULL); 
CFStringRef uuidString = CFUUIDCreateString(NULL, uuid); 
NSString *tmpDir = [[NSTemporaryDirectory() stringByAppendingPathComponent:(NSString *)uuidString]; 
CFRelease(uuid); 
CFRelease(uuidString); 
// MOVE IT 
[[NSFileManager defaultManager] moveItemAtPath:myDirPath toPath:tmpDir error:&error] 
+0

To najlepsze rozwiązanie, jeśli się poruszysz foldery o tej samej nazwie. – Mat

0

Ścieżka docelowa moveItemAtPath:toPath:error: musi być kompletna nowa ścieżka pliku lub katalog, który przenosisz. Jak teraz to robisz, zasadniczo próbujesz zastąpić sam katalog temp swoim plikiem.

Proste fix:

NSString *targetPath = [tmpDir stringByAppendingPathComponent:[newPath lastPathComponent]]; 
if ([[NSFileManager defaultManager] moveItemAtPath:targetPath toPath: error:&error]) { 
    NSLog(@"Moved sucessfully"); 
}