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


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 и проверьте его после removeItemAtPath
Дмитрий Шевченко

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 YES. Или что-то вроде того. Извините, сейчас не могу показать источники. Но проблема была тривиальной.
Вадим

Необходима ли проверка файла?
Санграм Шиванкар

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

Зачем делать функцию статической?
CalZone

Тебе решать. В этом нет необходимости
Роман Барзичак

Есть ли способ проверить, существует ли файл до / после вызова функции, чтобы убедиться, что он был удален?
Лука

1
да, конечно: let fileManager = FileManager.default if fileManager.fileExists (atPath: filePath!) {print ("ФАЙЛ ДОСТУПЕН")} else {print ("ФАЙЛ НЕДОСТУПЕН")}
Роман Барзичак

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
Добавьте следующее в последней строке вместо прямой попытки. do {попробуйте filemanager.removeItem (atPath: destinationPath) print ("Deleted")} catch {print ("Not Deleted")}
Абхираджсинх Такор,

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) На данный момент вы ДОЛЖНЫ использовать do {} catch {}, поскольку старые методы обработки ошибок больше не работают. isDeletableFileAtPath () не является "throws" (то есть "public func removeItemAtPath (path: String) throws"), поэтому ему не требуется do ... 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.