2010-08-04 15 views
9

En mi aplicación, dejo que el usuario grabe un clip de sonido y luego, si el usuario lo elige, quiero que pueda eliminarlo.iPhone/Objetivo C: No se puede eliminar un archivo

Este es el código que utilizo:

NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSError *error; 
NSLog(@"File exists: %d", [fileManager fileExistsAtPath:path]); 
NSLog(@"Is deletable file at path: %d", [fileManager isDeletableFileAtPath:path]); 
[fileManager removeItemAtPath:path error:&error]; 
if (error != nil) 
{ 
    NSLog(@"Error: %@", error); 
    NSLog(@"Path to file: %@", path); 
} 

El problema es que fileExistsAtPath y isDeletableFileAtPath retorno nulo y el removeItemAtPath no funciona, y arroja este error,

Error: Error Domain=NSCocoaErrorDomain Code=4 UserInfo=0x391b7f0 "Operation could not be completed. (Cocoa error 4.)"

El camino tiene esta forma:

/Users/andrei/Library/Application%20Support/iPhone%20Simulator/User/Applications/5472B318-FA57-4F8D-AD91-7E06E9609215/Documents/1280913694.caf 

hay un archivo llamado 1280913694.caf allí, pero no la recoja. ¿Tiene algo que ver con la forma en que debe representarse el camino?

La ruta funciona cuando se reproduce el archivo de audio con AVAudioPlayer.

También ha cambiado el %@ a %d para fileExistsAtPath y isDeletableFileAtPath y la respuesta es 0, lo que supongo significa FALSO.

El nombre del archivo se almacena en una base de datos, y la ruta del archivo se recupera con este método:

-(NSString *)returnFullPathToDirectory 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    return documentsDirectory; 
} 

Después de obtener este valor, lo uso en el siguiente código

NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName]; 
+1

Cambie los dos '% @' antes de '-removeItemAtPath' a'% d' y vuelva a ejecutar. – kennytm

+0

tenga en cuenta que el prefijo file: // debe eliminarse, es decir, convertir a NSURL y obtener el atributo .path (como de hecho, la ruta es anterior) – ThomasRS

Respuesta

26

Su cheque es incorrecta. Debe establecer un BOOL en el valor de retorno del método y usarlo para manejar las condiciones de error, ya que es posible que el método se complete con éxito y que el error no sea nulo después. Por lo tanto, es posible que el archivo se haya eliminado, pero se está produciendo un error incorrecto.

Tampoco debería intentar eliminar el archivo si no existe.

Además, por lo general sólo tiene que entrar localizedDescription del error ya que es más fácil de leer

Este código funciona en mi proyecto (ruta se define en otra parte):

NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    BOOL fileExists = [fileManager fileExistsAtPath:path]; 
    NSLog(@"Path to file: %@", path);   
    NSLog(@"File exists: %d", fileExists); 
    NSLog(@"Is deletable file at path: %d", [fileManager isDeletableFileAtPath:path]); 
    if (fileExists) 
    { 
     BOOL success = [fileManager removeItemAtPath:path error:&error]; 
     if (!success) NSLog(@"Error: %@", [error localizedDescription]); 
    } 

respuesta relacionada: NSError: Does using nil to detect Error actually turn off error reporting?

0

La ruta del archivo codificada en la URL me parece sospechosa. Leí en alguna parte que las rutas de archivos de iPhone deberían representarse como URL en estos días, pero no creo que los espacios tengan que estar codificados en la URL.

Intenta eliminar el% 20 de tu camino e intentarlo de nuevo?

+1

Deje que la ruta del archivo sea: **/Users/andrei/Library/Soporte de la aplicación/Simulador de iPhone/Usuario/Aplicaciones/0547AE74-AD10-4BEF-98CF-8FFF5BB2F70F/Documents/1280913694.caf ** Así que, no% 20, y ahora ... que es raro, me dice que el archivo no existe (devuelve 0 en fileExistsAtPath), pero también que el archivo es eliminable (devuelve 1 en isDeletableFileAtPath). El error persiste y no se está eliminando el archivo. – Andrei

+0

¿Podría publicar el código que está utilizando para recuperar la ruta? – Jasarien

+0

publicado en la pregunta original como segunda edición (** edit2 **) – Andrei

-8

intenta cambiar

NSFileManager *fileManager = [NSFileManager defaultManager]; 

a: (error = nil)

NSFileManager *fileManager = [NSFileManager new]; 
+4

uh, no. Él tenía razón para empezar. –

+0

¿Es eso incluso el objetivo apropiado-c? – Jason

Cuestiones relacionadas