2013-02-22 13 views
102

Desidero eliminare un'immagine dalla directory del documento dell'app. Il codice che ho scritto per cancellare l'immagine è:Elimina il file specificato dalla directory del documento

-(void)removeImage:(NSString *)fileName 
{ 
    fileManager = [NSFileManager defaultManager]; 
    paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    documentsPath = [paths objectAtIndex:0]; 
    filePath = [documentsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", fileName]]; 
    [fileManager removeItemAtPath:filePath error:NULL]; 
    UIAlertView *removeSuccessFulAlert=[[UIAlertView alloc]initWithTitle:@"Congratulation:" message:@"Successfully removed" delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil]; 
    [removeSuccessFulAlert show]; 
} 

Funzionante parzialmente. Questo codice che cancella il file dalla directory, ma quando sto controllando i contenuti nella directory, mostra ancora lì il nome dell'immagine. Voglio rimuovere completamente quel file dalla directory. Cosa devo cambiare nel codice per fare lo stesso? Grazie

+4

E 'probabile gettando un errore che hai ignorato, aggiungi esempio NSError e controllare dopo removeItemAtPath –

+1

uso - (BOOL) fileExistsAtPath: (NSString *) percorso; per verificare se l'immagine esiste, se restituisce SÌ, significa che la tua rimozione non è riuscita –

+0

Appena testato e definitivamente viene rimosso e la rimozione si riflette in 'contentsOfDirectoryAtPath' (cioè nessuna cache nella directory coinvolta qui). Quindi devi avere qualche semplice errore in gioco che dovrebbe diventare evidente quando guardi il contenuto di 'NSError'. – Rob

risposta

227

Ho controllato il codice. Funziona per me. Controllare ogni errore hai trovato utilizzando il codice modificato di seguito

- (void)removeImage:(NSString *)filename 
{ 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 

    NSString *filePath = [documentsPath stringByAppendingPathComponent:filename]; 
    NSError *error; 
    BOOL success = [fileManager removeItemAtPath:filePath error:&error]; 
    if (success) { 
     UIAlertView *removedSuccessFullyAlert = [[UIAlertView alloc] initWithTitle:@"Congratulations:" message:@"Successfully removed" delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil]; 
     [removedSuccessFullyAlert show]; 
    } 
    else 
    { 
     NSLog(@"Could not delete file -:%@ ",[error localizedDescription]); 
    } 
} 
+0

Posso creare un file nella directory Documento ma ottengo sempre un errore quando provo a rimuoverlo. Hai qualche idea? – Vadim

+0

@VadymK quale errore si sta ottenendo? posso vedere il tuo codice? –

+0

L'ho risolto. Il problema era: ho creato un nuovo file senza attributi e, come ho capito, ha fornito un attributo predefinito NSFileImmutable YES. O qualcosa di simile. Spiacenti non posso mostrare fonti ora. Ma il problema era banale. – Vadim

5

Invece di avere l'errore impostato su NULL, ce l'ha impostata

NSError *error; 
[fileManager removeItemAtPath:filePath error:&error]; 
if (error){ 
NSLog(@"%@", error); 
} 

questo vi dirà se è in realtà l'eliminazione del file

2
NSError *error; 
    [[NSFileManager defaultManager] removeItemAtPath:new_file_path_str error:&error]; 
    if (error){ 
     NSLog(@"%@", error); 
    } 
50

Swift 3.0:

func removeImage(itemName:String, fileExtension: String) { 
    let fileManager = FileManager.default 
    let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory 
    let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask 
    let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true) 
    guard let dirPath = paths.first else { 
     return 
    } 
    let filePath = "\(dirPath)/\(itemName).\(fileExtension)" 
    do { 
    try fileManager.removeItem(atPath: filePath) 
    } catch let error as NSError { 
    print(error.debugDescription) 
    }} 

Grazie alla @Anil Varghese, ho scritto codice molto simile a Swift 2.0:

static func removeImage(itemName:String, fileExtension: String) { 
    let fileManager = NSFileManager.defaultManager() 
    let nsDocumentDirectory = NSSearchPathDirectory.DocumentDirectory 
    let nsUserDomainMask = NSSearchPathDomainMask.UserDomainMask 
    let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true) 
    guard let dirPath = paths.first else { 
    return 
    } 
    let filePath = "\(dirPath)/\(itemName).\(fileExtension)" 
    do { 
    try fileManager.removeItemAtPath(filePath) 
    } catch let error as NSError { 
    print(error.debugDescription) 
    } 
} 
+0

Perché rendere la funzione statica? – CalZone

+0

Dipende da te. Non è necessario –

+0

C'è un modo per verificare se il file esiste ancora prima/dopo aver chiamato la funzione per assicurarsi che sia stata rimossa? – luke

11

Swift 2.0:

func removeOldFileIfExist() { 
    let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) 
    if paths.count > 0 { 
     let dirPath = paths[0] 
     let fileName = "someFileName" 
     let filePath = NSString(format:"%@/%@.png", dirPath, fileName) as String 
     if NSFileManager.defaultManager().fileExistsAtPath(filePath) { 
      do { 
       try NSFileManager.defaultManager().removeItemAtPath(filePath) 
       print("old image has been removed") 
      } catch { 
       print("an error during a removing") 
      } 
     } 
    } 
} 
0

È possibile proteggere la rimozione dei file con NSFileManager.defaultManager(). IsDeletableFileAtPath (PathName) A partire da ora è necessario utilizzare do {} catch {} poiché i vecchi metodi di errore non funzionano più. isDeletableFileAtPath() non è un "getta" (cioè "removeItemAtPath func pubblica (path: String) getta") in modo che non ha bisogno del do ... catch

let killFile = NSFileManager.defaultManager() 

      if (killFile.isDeletableFileAtPath(PathName)){ 


       do { 
        try killFile.removeItemAtPath(arrayDictionaryFilePath) 
       } 
       catch let error as NSError { 
        error.description 
       } 
      } 
2

Voglio cancellare il mio SQLite db dal documento directory.I cancellare il db SQLite con successo da sotto risponde

NSString *strFileName = @"sqlite"; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

NSArray *contents = [fileManager contentsOfDirectoryAtPath:documentsDirectory error:NULL]; 
NSEnumerator *enumerator = [contents objectEnumerator]; 
NSString *filename; 
while ((filename = [enumerator nextObject])) { 
    NSLog(@"The file name is - %@",[filename pathExtension]); 
    if ([[filename pathExtension] isEqualToString:strFileName]) { 
     [fileManager removeItemAtPath:[documentsDirectory stringByAppendingPathComponent:filename] error:NULL]; 
     NSLog(@"The sqlite is deleted successfully"); 
    } 
} 
0

Se siete interessanti in modo moderno api, evitando file NSSearchPath e filtro nella directory di documenti, prima della cancellazione, si può fare come:

let fileManager = FileManager.default 
let keys: [URLResourceKey] = [.nameKey, .isDirectoryKey] 
let options: FileManager.DirectoryEnumerationOptions = [.skipsHiddenFiles, .skipsPackageDescendants] 
guard let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask).last, 
     let fileEnumerator = fileManager.enumerator(at: documentsUrl, 
                includingPropertiesForKeys: keys, 
                options: options) else { return } 

let urls: [URL] = fileEnumerator.flatMap { $0 as? URL } 
           .filter { $0.pathExtension == "exe" } 
for url in urls { 
    do { 
     try fileManager.removeItem(at: url) 
    } catch { 
     assertionFailure("\(error)") 
    } 
} 
0

versione FreeGor convertito in Swift 3,0

func removeOldFileIfExist() { 
    let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true) 
    if paths.count > 0 { 
     let dirPath = paths[0] 
     let fileName = "filename.jpg" 
     let filePath = NSString(format:"%@/%@", dirPath, fileName) as String 
     if FileManager.default.fileExists(atPath: filePath) { 
      do { 
       try FileManager.default.removeItem(atPath: filePath) 
       print("User photo has been removed") 
      } catch { 
       print("an error during a removing") 
      } 
     } 
    } 
} 
Problemi correlati