2012-05-16 23 views
11

Sto riscontrando qualche problema con l'utilizzo delle funzionalità di NSFileManager. Ciò accade sia sul simulatore che su un dispositivo iPhone (iOS 5.1).NSFileManager non sta eliminando un file esistente

Fondamentalmente, ho un sacco di file che sono memorizzati in un documento che ho creato. Ora sto cercando di spostare un file (memorizzato nel percorso) nella stessa directory con un altro nome, per verificare se la cancellazione funziona.

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

L'uscita di questo è in entrambi i file percorso e percorso .deleted. Alla fine voglio solo rimuovere il file usando removeItemAtPath ma non funziona. Ritorna un successo ma se lo vedo nella directory dei file posso ancora vederlo lì anche dopo un'ora.

risposta

33

Se si desidera eliminare un file è necessario utilizzare removeItemAtPath:myPath error:NULL come

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

Ho provato anche questo ma non funziona neanche. Il problema è che sia che utilizzi moveItemAtPath o deleteItemAtPath, il file sul percorso non venga cancellato. – Devang

+0

Ho trovato il problema nel mio codice. Era solo che avevo avviato un NSTimer da qualche parte che avrebbe continuato a salvare il file ogni pochi secondi, quindi anche dopo l'eliminazione, il file è stato nuovamente scritto dando l'impressione che non venga eliminato. Sto accettando questa risposta poiché tecnicamente è corretto. – Devang

+1

Mi consiglia di aggiungere in fileExistsAtPath anche la logica.Ho notato che isDeletableFileAtPath restituisce ancora true per un po 'dopo che il file è stato cancellato/rimosso, ma fileExistsAtPath è sempre corretto. – user3344977

1

Utilizzare questo per il percorso di ricerca e di eliminare un video

(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

Ho incontrato lo stesso problema. Sono ancora sconcertato sul motivo per cui la correzione funziona, ma vale la pena menzionarla nel caso in cui altri possano spiegarlo.

Ho scoperto che [[NSFileManager defaultManager] removeItemAtURL:url error:&error] restituisce false al primo tentativo ma con un errore nullo. Al secondo tentativo sarebbe tornato vero.

Ecco cosa il mio codice sembrava:

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

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

ho scoperto che se ho creato il mio esempio NSFileManager, che avrebbe funzionato al primo tentativo.

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

Sono in esecuzione sul simulatore iOS9. Questo puzza di bug. Ho intenzione di presentare un radar.

0

Ho appena capito da qualcosa di molto importante quando si utilizza NSFileManager. Devi essere a conoscenza di App Sandboxing.

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

Questa linea di ritorno del documento directory percorso della vostra applicazione sandbox. Quando si crea un file con FileManager nella directory del documento (ad esempio) non salvare il percorso completo del file ma solo il percorso dalla directory del documento corrente.

Sarai in grado di ricreare il percorso completo del file creato.

Hope (dopo 5 anni) aiuto sugli sviluppatori ;-)

Problemi correlati