Hapus file tertentu dari direktori dokumen


111

Saya ingin menghapus gambar dari direktori dokumen aplikasi saya. Kode yang saya tulis untuk menghapus gambar adalah:

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

Ini bekerja sebagian. Kode ini menghapus file dari direktori, tetapi ketika saya memeriksa isinya di direktori, masih menampilkan nama gambar di sana. Saya ingin menghapus file itu sepenuhnya dari direktori. Apa yang harus saya ubah dalam kode untuk melakukan hal yang sama? Terima kasih


4
Sepertinya ada kesalahan yang Anda abaikan, tambahkan instance NSError dan periksa setelah removeItemAtPath
Dmitry Shevchenko

1
gunakan - (BOOL) fileExistsAtPath: (NSString *) jalur; untuk memeriksa apakah gambar tersebut ada, jika mengembalikan YA, itu berarti penghapusan Anda gagal
Guo Luchuan

Baru saja mengujinya dan itu pasti akan dihapus dan penghapusan tercermin dalam contentsOfDirectoryAtPath(yaitu tidak ada direktori caching yang terlibat di sini). Jadi, Anda pasti memiliki beberapa kesalahan sederhana dalam permainan yang akan terlihat ketika Anda melihat NSErrorisinya.
Rob

Jawaban:


238

Aku sudah memeriksa kodemu. Ini bekerja untuk saya. Periksa kesalahan apa pun yang Anda dapatkan dengan menggunakan kode yang dimodifikasi di bawah ini

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

Saya dapat membuat file di direktori Dokumen tetapi selalu mendapatkan kesalahan saat mencoba menghapusnya. Apakah Anda punya ide?
Vadim

Saya menyelesaikannya. Masalahnya adalah: Saya membuat file baru tanpa atribut apa pun, dan seperti yang saya mengerti, itu memberikan atribut default NSFileImmutable YES. Atau semacam itu. Maaf tidak dapat menampilkan sumber sekarang. Tapi masalahnya sepele.
Vadim

Apakah memeriksa file ada atau tidak perlu?
Sangram Shivankar

itu menghapus file dari direktori tetapi masih menampilkan gambar dalam foto 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)
  }}

Terima kasih kepada @Anil Varghese, saya menulis kode yang sangat mirip di 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)
  }
}

Mengapa membuat fungsinya statis?
CalZone

Terserah kamu. Tidak perlu
Roman Barzyczak

Apakah ada cara untuk memeriksa apakah file masih ada sebelum / setelah memanggil fungsi untuk memastikannya telah dihapus?
Lukas

1
yes sure: let fileManager = FileManager.default if fileManager.fileExists (atPath: filePath!) {print ("FILE AVAILABLE")} else {print ("FILE NOT AVAILABLE")}
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

Di Swift baik 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)
    }
    }

atau Metode ini dapat menghapus semua file lokal

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
Tambahkan yang berikut ini di baris terakhir sebagai gantinya untuk mencoba langsung. do {coba filemanager.removeItem (atPath: destinationPath) print ("Deleted")} catch {print ("Not Deleted")}
Abhirajsinh Thakore

5

Alih-alih menyetel kesalahan ke NULL, setel ke

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

ini akan memberi tahu Anda jika itu benar-benar menghapus file


3

Saya ingin menghapus sqlite db saya dari direktori dokumen. Saya berhasil menghapus sqlite db dengan jawaban di bawah ini

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

Versi FreeGor dikonversi ke 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

Anda bisa melindungi dua kali penghapusan file Anda dengan NSFileManager.defaultManager (). IsDeletableFileAtPath (PathName) Mulai sekarang Anda HARUS menggunakan do {} catch {} karena metode kesalahan lama tidak lagi berfungsi. isDeletableFileAtPath () bukan "throws" (yaitu "public func removeItemAtPath (path: String) throws") jadi tidak perlu do ... catch

let killFile = NSFileManager.defaultManager()

            if (killFile.isDeletableFileAtPath(PathName)){


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

0

Jika Anda tertarik dengan cara api modern, hindari NSSearchPath dan filter file di direktori dokumen, sebelum menghapus, Anda dapat melakukan seperti:

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)")
   }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.