Löschen Sie die angegebene Datei aus dem Dokumentverzeichnis


111

Ich möchte ein Bild aus meinem App-Dokumentverzeichnis löschen. Der Code, den ich zum Löschen des Bildes geschrieben habe, lautet:

 -(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 eine 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 muss ich im Code ändern, um dasselbe zu tun? Vielen Dank


4
Es ist wahrscheinlich, einen Fehler zu werfen, den Sie ignoriert haben, NSError-Instanz hinzuzufügen und ihn nach removeItemAtPath
Dmitry Shevchenko

1
use - (BOOL) fileExistsAtPath: (NSString *) path; Um zu überprüfen, ob das Bild existiert, wenn es JA zurückgibt, bedeutet dies, dass Ihre Entfernung fehlgeschlagen ist
Guo Luchuan

Habe es gerade getestet und es wird definitiv entfernt und das Entfernen spiegelt sich in contentsOfDirectoryAtPath(dh hier ist kein Verzeichnis-Caching beteiligt). Sie müssen also einen einfachen Fehler im Spiel haben, der sich beim Betrachten des NSErrorInhalts bemerkbar machen sollte .
Rob

Antworten:


238

Ich habe Ihren Code überprüft. Es funktioniert für mich. Überprüfen Sie alle Fehler, die Sie erhalten, indem Sie den unten geänderten Code verwenden

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

Ich kann eine Datei im Dokumentverzeichnis erstellen, erhalte jedoch immer eine Fehlermeldung, wenn ich versuche, sie zu entfernen. Hast du eine Idee?
Vadim

Ich habe es gelöst. Das Problem war: Ich habe eine neue Datei ohne Attribute erstellt und nach meinem Verständnis ein Standardattribut NSFileImmutable YES angegeben. Oder etwas ähnliches. Leider können jetzt keine Quellen angezeigt werden. Aber das Problem war trivial.
Vadim

Ist eine Überprüfungsdatei vorhanden oder nicht erforderlich?
Sangram Shivankar

es löscht Datei aus dem Verzeichnis, aber es zeigt immer noch Bild in Fotos von Simulator
Sagar Koyani

55

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

Dank @Anil Varghese habe ich in Swift 2.0 sehr ähnlichen Code geschrieben:

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

Warum die Funktion statisch machen?
CalZone

Es liegt an dir. Es ist nicht notwendig
Roman Barzyczak

Gibt es eine Möglichkeit zu überprüfen, ob die Datei vor / nach dem Aufruf der Funktion noch vorhanden ist, um sicherzustellen, dass sie entfernt wurde?
luke

1
Ja sicher: Lassen Sie fileManager = FileManager.default, wenn fileManager.fileExists (atPath: filePath!) {print ("DATEI VERFÜGBAR")} else {print ("DATEI NICHT VERFÜGBAR")}
Roman Barzyczak

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

8

In Swift sowohl 3 als auch 4

 func removeImageLocalPath(localPathName:String) {
            let filemanager = FileManager.default
            let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask,true)[0] as NSString
            let destinationPath = documentsPath.appendingPathComponent(localPathName)
 do {
        try filemanager.removeItem(atPath: destinationPath)
        print("Local path removed successfully")
    } catch let error as NSError {
        print("------Error",error.debugDescription)
    }
    }

oder Diese Methode kann alle lokalen Dateien löschen

func deletingLocalCacheAttachments(){
        let fileManager = FileManager.default
        let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
        do {
            let fileURLs = try fileManager.contentsOfDirectory(at: documentsURL, includingPropertiesForKeys: nil)
            if fileURLs.count > 0{
                for fileURL in fileURLs {
                    try fileManager.removeItem(at: fileURL)
                }
            }
        } catch {
            print("Error while enumerating files \(documentsURL.path): \(error.localizedDescription)")
        }
    }

2
Fügen Sie stattdessen in der letzten Zeile Folgendes hinzu, um den direkten Versuch zu starten. do {try filemanager.removeItem (atPath: destinationPath) print ("Gelöscht")} catch {print ("Nicht gelöscht")}
Abhirajsinh Thakore

5

Anstatt den Fehler auf NULL zu setzen, müssen Sie ihn auf NULL setzen

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

Hier erfahren Sie, ob die Datei tatsächlich gelöscht wird


3

Ich möchte meine SQLite-Datenbank aus dem Dokumentverzeichnis löschen. Ich lösche die SQLite-Datenbank erfolgreich durch die folgende Antwort

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

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

1

FreeGor-Version auf Swift 3.0 konvertiert

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

0

Sie können das Entfernen Ihrer Datei mit NSFileManager.defaultManager () doppelt schützen. IsDeletableFileAtPath (PathName) Ab sofort MÜSSEN Sie do {} catch {} verwenden, da die alten Fehlermethoden nicht mehr funktionieren. isDeletableFileAtPath () ist kein "throw" (dh "public func removeItemAtPath (path: String) throw"), daher wird der do ... catch nicht benötigt

let killFile = NSFileManager.defaultManager()

            if (killFile.isDeletableFileAtPath(PathName)){


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

0

Wenn Sie auf moderne API-Weise interessiert sind, NSSearchPath vermeiden und Dateien im Dokumentenverzeichnis filtern, können Sie vor dem Löschen Folgendes 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)")
   }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.