2012-05-16 24 views
11

Tengo un problema con el uso de las funcionalidades de NSFileManager. Esto ocurre tanto en el simulador como en un dispositivo de iPhone (iOS 5.1).NSFileManager no elimina un archivo que existe

Básicamente, tengo un montón de archivos que se almacenan en un documento que he creado. Ahora estoy tratando de mover un archivo (almacenado en la ruta) al mismo directorio con otro nombre, para verificar si la eliminación funciona.

if ([[NSFileManager defaultManager] isDeletableFileAtPath:path]) { 
BOOL success = [[NSFileManager defaultManager] moveItemAtPath:path toPath:[path   stringByAppendingString:@".deleted"] error:&error]; 
if (!success) { 
     NSLog(@"Error removing file at path: %@", error.localizedDescription); 
    } 
} 

La salida de este es a la vez archivos en ruta y ruta .deleted. En última instancia, solo quiero eliminar el archivo usando removeItemAtPath pero eso no está funcionando. Devuelve un éxito, pero si lo veo en el directorio de archivos, aún puedo verlo allí incluso después de una hora.

Respuesta

33

Si desea eliminar un archivo que puedes usar como removeItemAtPath:myPath error:NULL

NSError *error; 
if ([[NSFileManager defaultManager] isDeletableFileAtPath:path]) { 
    BOOL success = [[NSFileManager defaultManager] removeItemAtPath:path error:&error]; 
    if (!success) { 
     NSLog(@"Error removing file at path: %@", error.localizedDescription); 
    } 
} 
+0

He intentado esto también, pero tampoco funciona. El problema es que si utilizo moveItemAtPath o deleteItemAtPath, el archivo en la ruta no se elimina. – Devang

+0

Encontré el problema en mi código. Era solo que había iniciado un NSTimer en algún lugar que seguiría guardando el archivo cada pocos segundos, por lo que incluso después de eliminar, el archivo se volvió a escribir dando la impresión de que no se borraba. Estoy aceptando esta respuesta ya que técnicamente es correcta. – Devang

+1

Recomiendo agregar FileExistsAtPath con su lógica también.He notado que a veces isDeletableFileAtPath sigue siendo cierto por un tiempo después de que el archivo ha sido eliminado/eliminado, pero fileExistsAtPath siempre es correcto. – user3344977

1

uso de esta ruta de búsqueda y eliminar un vídeo

(NSString *)applicationDocumentsDirectory { 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 
    return basePath; 
    } 
NSString *dataFilePath = [[[self applicationDocumentsDirectory] 
           stringByAppendingPathComponent:@"Data.nosync"] 
           stringByAppendingPathComponent:[NSString stringWithFormat:@"%@-%@.mp4",[dicForDelete valueForKey:keyVideoId],[dicForDelete valueForKey:keyVideoName]]]; 
NSError *error; 
if ([[NSFileManager defaultManager] isDeletableFileAtPath:dataFilePath]) { 
     BOOL success = [[NSFileManager defaultManager] removeItemAtPath:dataFilePath error:&error]; 
     if (success) { 
      [email protected]"file deleted "); 
     }else 
     { 
     [email protected]"file not deleted "); 
     } 
    } 
1

me encontré con el mismo problema. Todavía estoy desconcertado sobre por qué funciona el arreglo, pero vale la pena mencionarlo en caso de que otros puedan explicarlo.

Descubrí que [[NSFileManager defaultManager] removeItemAtURL:url error:&error] devolvería falso en el primer intento pero con un error nulo. En el segundo intento, volvería verdadero.

Esto es lo que mi código parecía:

// success == NO error = nil 
BOOL success = [[NSFileManager defaultManager] removeItemAtURL:storeUrl error:&error]; 

// success == YES error = nil 
success = [[NSFileManager defaultManager] removeItemAtURL:storeUrl error:&error]; 

he descubierto que si he creado mi propia instancia NSFileManager, que funcionaría en el primer intento.

NSFileManager *fm = [[NSFileManager alloc] init]; 
[fm removeItemAtURL:storeUrl error:&error]; 

Estoy usando el simulador iOS9. Esto huele a un error. Voy a archivar un radar.

0

Acabo de resolver algo muy importante cuando utilizas NSFileManager. Debes estar al tanto de App Sandboxing.

let documentDirectory = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, .UserDomainMask, true)[0] 

Esta línea devuelve el directorio del documento de ruta de su aplicación con espacio aislado. Cuando crea un archivo con FileManager en su directorio de documentos (por ejemplo), no guarde la ruta completa del archivo, sino solo la ruta desde el directorio actual del documento.

Podrá recrear la ruta completa de su archivo creado.

Espero (después de 5 años) ayudar a los desarrolladores ;-)

Cuestiones relacionadas