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


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

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