2012-02-20 25 views
5

trato de mover una carpeta con un archivo a una carpeta temporal, pero siempre recibo el mismo error: La operación no se pudo completar. (Error de cacao 516.)Extraño error al mover una carpeta a la temperatura con moveItemAtPath. de error de cacao 516

Este es el código, lo que ves algo extraño? Gracias por adelantado.

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

Respuesta

13

error 516 es NSFileWriteFileExistsError

No se puede mover un archivo a un lugar donde ya existe un archivo :)

(Ver documentos aquí - https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference.html y la búsqueda de '516')


Más útilmente, su ruta de destino debe ser un nombre de archivo, no una carpeta. Prueba esto:

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

Gracias por la respuesta! Olvidé decir que estoy trabajando para la plataforma iOS, aunque el documento y el código de error son los mismos si cambias en la URL "mac" por "ios". Intenté lo que dijiste, eliminando mi aplicación de mi simulador y dispositivo (por lo tanto, el directorio temporal está vacío) y dice 516. Acerca de lo que dices sobre un archivo, en los documentos que puedo leer: "moveItemAtPath: toPath: error: Mueve el archivo o directorio en la ruta especificada a una nueva ubicación de forma síncrona " ¿Conoces alguna otra forma de mover una carpeta dentro de la carpeta tmp? Una categoría o biblioteca? ¡Gracias! – Ricardo

+0

Por cierto, su código funciona, pero solo mueve un archivo, pero prefiero mover una carpeta llena de archivos. ¿Alguna idea? Tal vez usando recursividad, pero solo quería mover la carpeta porque eliminar la carpeta (o copiar archivo por archivo) toma unos segundos (hay muchos archivos, aproximadamente 500 MB). ¿Alguna idea o sugerencia? Muchas gracias por tu ayuda. – Ricardo

+0

Debería funcionar si acaba de pasar la ruta de la carpeta en lugar de la ruta del archivo, es decir, en lugar de 'newPath' usar' [newPath stringByDeletingLastPathComponent] 'para obtener la carpeta en la que se encuentra newFile? – deanWombourne

2

obtener un nombre de carpeta temporal único usando el siguiente método:

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

esta es la mejor solución si se muda carpetas con el mismo nombre. – Mat

0

La ruta de destino para moveItemAtPath:toPath:error: tiene que ser la nueva ruta completa del archivo o directorio al que se muda. Como lo hace ahora, básicamente está tratando de sobrescribir el directorio temporal en sí con su archivo.

solución sencilla:

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