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


quelle
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]);
  }
}
Anil Varghese
quelle
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)
  }
}
Roman Barzyczak
quelle
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")
            }
        }
    }
}
FreeGor
quelle
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)")
        }
    }
Sai Kumar Reddy
quelle
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

Chris Loonam
quelle
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");
    }
}
user3182143
quelle
2
    NSError *error;
    [[NSFileManager defaultManager] removeItemAtPath:new_file_path_str error:&error];
    if (error){
        NSLog(@"%@", error);
    }
Alex Spencer
quelle
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")
            }
        }
    }
}
Andrea Leganza
quelle
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
                }
            }
Bergmann
quelle
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)")
   }
}
Azon
quelle