Видаліть вказаний файл із каталогу документів


111

Я хочу видалити зображення зі свого каталогу документів програми. Код, який я написав для видалення зображення:

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

Його працює частково. Цей код видаляє файл з каталогу, але коли я перевіряю вміст у каталозі, він все ще показує ім'я зображення там. Я хочу повністю видалити цей файл із каталогу. Що потрібно змінити в коді, щоб зробити те саме? Дякую


4
Ймовірно, викинете помилку, яку ви проігнорували, додайте екземпляр NSError та перевірте його після видаленняItemAtPath
Дмитро Шевченко

1
використання - (BOOL) fileExistsAtPath: (NSString *) шлях; щоб перевірити, чи існує зображення, якщо він повернеться ТАК, це означає, що видалення не вдалося
Го Лучуань,

Тільки тестуйте його, і його напевно видаляють, і видалення відображається в contentsOfDirectoryAtPath(тобто тут не задіяно кешування каталогу). Отже, у вас повинна бути проста помилка в грі, яка повинна стати очевидною при перегляді NSErrorвмісту.
Роб

Відповіді:


238

Я перевірив ваш код. Це працює для мене. Перевірте будь-яку помилку, яку ви отримуєте за допомогою модифікованого коду нижче

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

Я можу створити файл у каталозі документів, але завжди отримую помилку при спробі його видалити. У вас є ідеї?
Вадим

Я вирішив це. Проблема полягала в тому, що я створив новий файл без будь-яких атрибутів, і, як я розумію, він дав атрибут за замовчуванням NSFileImmutable ТАК. Або щось подібне. На жаль, зараз не можна показувати джерела. Але проблема була тривіальною.
Вадим

Чи потрібна перевірка файлу чи ні?
Sangram Shivankar

він видаляє файл з каталогу, але все ще показує зображення на фотографіях симулятора
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)
  }}

Завдяки @Anil Varghese, я написав дуже подібний код у швидкій 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)
  }
}

Навіщо робити функцію статичною?
CalZone

Тобі вирішувати. Це не потрібно
Роман Барзичак

Чи є спосіб перевірити, чи існує файл ще до / після виклику функції, щоб переконатися, що його видалено?
luke

1
так впевнений: нехай fileManager = FileManager.default, якщо fileManager.fileExists (atPath: filePath!) {print ("FILE AVAILABLE")} else {print ("FILE NOT DOILL")}
Роман Баржичак

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

У Swift і 3, і 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)
    }
    }

або Цей метод може видалити весь локальний файл

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
В останньому рядку замість прямої спроби додайте наступне. виконайте {спробуйте filemanager.removeItem (atPath: targetPath) print ("Видалено")} ловити {print ("Не видалено")}
Abhirajsinh Thakore

5

Замість встановлення помилки NULL встановіть її

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

це підкаже, чи дійсно це видалення файлу


3

Я хочу видалити свій sqlite db з каталогу документів. Я видаляю sqlite db успішно, відповівши нижче

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


1

Версія FreeGor перетворена на 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")
            }
        }
    }
}

0

Ви можете подвоїти захист видалення файлів за допомогою NSFileManager.defaultManager (). IsDeletableFileAtPath (PathName). З цього моменту ви повинні використовувати {} catch {}, оскільки старі методи помилок більше не працюють. isDeletableFileAtPath () не є "кидками" (тобто "public func removeItemAtPath (path: String)" кидає "), тому йому не потрібно робити ... catch

let killFile = NSFileManager.defaultManager()

            if (killFile.isDeletableFileAtPath(PathName)){


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

0

Якщо вам цікавий сучасний api-спосіб, уникаючи NSSearchPath та фільтрувати файли в каталозі документів, перед видаленням ви можете зробити так:

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)")
   }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.