2010-08-04 13 views
9

Nella mia applicazione, faccio in modo che l'utente registri una clip audio e in seguito, se l'utente lo sceglie, voglio che sia in grado di eliminarlo.iPhone/Objective C: Impossibile eliminare un file

Questo è il codice che uso:

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

Il problema è che fileExistsAtPath e isDeletableFileAtPath ritorno nullo e il removeItemAtPath non funziona, e getta questo errore,

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

Il percorso ha questo modulo:

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

C'è un file chiamato 1280913694.caf, ma non lo raccoglie. Ha qualcosa a che fare con il modo in cui il percorso dovrebbe essere rappresentato?

Il percorso funziona durante la riproduzione del file audio con AVAudioPlayer.

Ho anche cambiato il %@ per %d per fileExistsAtPath e isDeletableFileAtPath e la risposta è 0, che suppongo significa FALSE.

Il nome del file viene memorizzato in un database, e il percorso del file viene recuperato con questo metodo:

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

Dopo ottengo questo valore, lo uso nel codice seguente

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

Per favore cambia i due '% @' prima di '-removeItemAtPath' a'% d' ed esegui di nuovo. – kennytm

+0

nota che il prefisso file: // deve essere rimosso, ovvero convertirlo in NSURL e ottenere l'attributo .path (come in effetti il ​​percorso è sopra) – ThomasRS

risposta

26

L'assegno per i non è corretto. È necessario impostare BOOL sul valore restituito del metodo e utilizzarlo per gestire le condizioni di errore poiché è possibile che il metodo venga completato correttamente e che l'errore non sia successivo. Quindi, il file potrebbe essere stato effettivamente cancellato, ma stai ricevendo un errore errato.

Non si dovrebbe inoltre provare a eliminare il file se non esiste.

Inoltre, di solito basta accedere localizedDescription della errore che è più facile da leggere

Questo codice funziona nel mio progetto (percorso è stato definito altrove):

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

risposta correlati: NSError: Does using nil to detect Error actually turn off error reporting?

0

Il percorso del file con codifica dell'URL mi sembra sospetto. Ho letto da qualche parte che i percorsi dei file iPhone dovrebbero essere rappresentati come URL in questi giorni, ma non penso che gli spazi debbano essere codificati in url.

Provare a rimuovere% 20 dal percorso e riprovare?

+1

Il percorso del file è: **/Users/andrei/Library/Application Support/iPhone Simulator/Utente/Applicazioni/0547AE74-AD10-4BEF-98CF-8FFF5BB2F70F/Documenti/1280913694.caf ** così, no% 20, e ora ... che è strano, mi dice che il file non esiste (restituisce 0 a fileExistsAtPath), ma anche che il file è cancellabile (restituisce 1 in isDeletableFileAtPath). L'errore rimane e non sta eliminando il file. – Andrei

+0

Potresti inserire il codice che stai utilizzando per recuperare il percorso? – Jasarien

+0

pubblicato nella domanda originale come seconda modifica (** edit2 **) – Andrei

-8

tenta di modificare

NSFileManager *fileManager = [NSFileManager defaultManager]; 

a: (Errore = nil)

NSFileManager *fileManager = [NSFileManager new]; 
+4

uh, no. Ha avuto ragione per cominciare. –

+0

È anche corretto obiettivo-c? – Jason

Problemi correlati