2013-02-22 21 views
102

Ich möchte ein Bild aus meinem App-Dokumentverzeichnis löschen. Code, den ich geschrieben habe, um Bild zu löschen, ist:Löschen der angegebenen Datei aus dem Dokumentverzeichnis

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

Es funktioniert teilweise. Dieser Code löscht die Datei aus dem Verzeichnis, aber wenn ich nach dem Inhalt im Verzeichnis suche, wird dort immer noch der Bildname angezeigt. Ich möchte diese Datei vollständig aus dem Verzeichnis entfernen. Was sollte ich im Code ändern, um dasselbe zu tun? Dank

+4

Es ist wahrscheinlich ein Fehler wirft, die Sie ignoriert, fügen NSError Instanz und überprüfen Sie es nach removeItemAtPath –

+1

Verwendung - (BOOL) fileExistsAtPath: (NSString *) Pfad; um zu überprüfen, ob das Bild existiert, wenn es YES zurückgibt, bedeutet das, dass das Entfernen fehlgeschlagen ist –

+0

Nur getestet und es wird definitiv entfernt und die Entfernung wird in 'contentsOfDirectoryAtPath' reflektiert (d. h. kein Verzeichnis-Caching ist hier involviert). Sie müssen also einen einfachen Fehler im Spiel haben, der offensichtlich werden sollte, wenn Sie den 'NSError'-Inhalt betrachten. – Rob

Antwort

227

ich Ihren Code überprüft. Es funktioniert für mich. Überprüfen Sie alle Fehler, den Sie unter

- (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

Ich kann eine Datei im Document-Verzeichnis erstellen, bekomme aber immer einen Fehler, wenn ich versuche, sie zu entfernen. Hast du eine Idee? – Vadim

+0

@VadymK Welchen Fehler bekommen Sie? Kann ich deinen Code sehen? –

+0

Ich habe es gelöst. Das Problem war: Ich erstellte eine neue Datei ohne irgendwelche Attribute, und wie ich es verstehe, gab es ein Standardattribut NSFileImmutable YES. Oder etwas ähnliches. Sorry kann jetzt keine Quellen anzeigen. Aber das Problem war trivial. – Vadim

5

Statt den Fehler mit auf NULL gesetzt, haben es

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

dies wird Ihnen auf

gesetzt sagen, ob es die Datei tatsächlich ist das Löschen

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

Swift 3.0 unter Verwendung der modifizierten Code bekommen:

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

Dank @Anil Varghese, schrieb ich sehr ähnlich Code in 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

Warum die Funktion statisch machen? – CalZone

+0

Es liegt an dir. Es ist nicht notwendig –

+0

Gibt es eine Möglichkeit zu überprüfen, ob die Datei vor/nach dem Aufruf der Funktion noch existiert, um sicherzustellen, dass sie entfernt wurde? – 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

Sie können Ihre Dateientfernung doppelt mit NSFileManager.defaultManager() schützen. IsDeletableFileAtPath (Pfadname) Ab sofort MÜSSEN Sie do {} catch {} verwenden, da die alten Fehlermethoden nicht mehr funktionieren. isDeletableFileAtPath() ist kein "wirft" (dh "public func removeItemAtPath (path: String) wirft") so dass es nicht das tun müssen ... catch

let killFile = NSFileManager.defaultManager() 

      if (killFile.isDeletableFileAtPath(PathName)){ 


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

Ich möchte meine SQLite löschen db aus dem Dokument directory.I die sqlite db löschen erfolgreich unten durch

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

beantworten Wenn Sie in einer modernen Art und Weise api interessant sind, zu vermeiden NSSearchPath und filtern von Dateien in Dokumentenverzeichnis, vor dem löschen können Sie tun:

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

FreeGor Version Swift umgewandelt 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") 
      } 
     } 
    } 
} 
Verwandte Themen