2012-02-20 13 views
5

Cerco di spostare una cartella con un file in una cartella temporanea, ma ricevo sempre lo stesso errore: Impossibile completare l'operazione. (Errore di cacao 516.)Errore strano quando si sposta una cartella in temp con moveItemAtPath. Errore cacao 516

Questo è il codice, vedi qualcosa di strano? Grazie in anticipo.

// 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); 
} 

risposta

13

errore 516 è NSFileWriteFileExistsError

Non è possibile spostare un file in un luogo dove esiste già un file :)

(vedi Documentazione qui - https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference.html e la ricerca di '516')


Più utile, il percorso di destinazione dovrebbe essere un nome di file, non una cartella. Prova questo:

// 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

Grazie per la risposta! Ho dimenticato di dire che sto lavorando per la piattaforma iOS, anche se il documento e il codice di errore sono gli stessi se si cambia nell'URL "mac" di "ios". Ho provato quello che hai detto, rimuovendo la mia app dal mio simulatore e dispositivo (quindi, temp dir è vuota) e dice 516. Informazioni su ciò che dici di un file, nella documentazione che posso leggere: "moveItemAtPath: toPath: errore: Sposta il file o la directory nel percorso specificato in una nuova posizione in modo sincrono " Conoscete un altro modo per spostare una cartella all'interno della cartella tmp? Una categoria o una biblioteca? Grazie! – Ricardo

+0

A proposito, il tuo codice funziona, ma sposta solo un file, ma preferisco spostare una cartella piena di file. Qualche idea? Forse usando la ricorsione, ma volevo solo spostare la cartella perché l'eliminazione della cartella (o copia file per file) richiede alcuni secondi (ci sono molti file, circa 500 MB). Qualche idea o suggerimento? Grazie mille per il vostro aiuto. – Ricardo

+0

Dovrebbe funzionare se si passa semplicemente il percorso della cartella al posto di un percorso file, invece di solo 'newPath' usare' [newPath stringByDeletingLastPathComponent] 'per ottenere la cartella in cui è presente newFile? – deanWombourne

2

ottenere un nome cartella temporanea unico, usando il seguente metodo:

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

questa è la soluzione migliore se si sposta cartelle con lo stesso nome. – Mat

0

Il percorso di destinazione per moveItemAtPath:toPath:error: deve essere il nuovo percorso completo del file o della directory che stai spostando. Mentre lo fai adesso, stai praticamente cercando di sovrascrivere la directory temporanea stessa con il tuo file.

correzione Semplice:

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