ลบไฟล์ที่ระบุออกจากไดเร็กทอรีเอกสาร


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
Dmitry Shevchenko

1
ใช้ - (BOOL) fileExistsAtPath: (NSString *) พา ธ ; เพื่อตรวจสอบว่ามีภาพอยู่หรือไม่หากส่งคืนใช่แสดงว่าการลบของคุณล้มเหลว
Guo Luchuan

เพิ่งทดสอบและจะถูกลบออกอย่างแน่นอนและการลบจะปรากฏในcontentsOfDirectoryAtPath(กล่าวคือไม่มีการแคชไดเรกทอรีที่นี่) ดังนั้นคุณต้องมีข้อผิดพลาดง่ายๆในการเล่นซึ่งควรจะเห็นได้ชัดเมื่อคุณดูNSErrorเนื้อหา
Rob

คำตอบ:


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

ฉันสามารถสร้างไฟล์ในไดเร็กทอรี Document แต่มักจะได้รับข้อผิดพลาดเมื่อพยายามลบออก คุณมีความคิดหรือไม่?
Vadim

ฉันแก้ไขมัน ปัญหาคือ: ฉันสร้างไฟล์ใหม่โดยไม่มีแอตทริบิวต์ใด ๆ และตามที่ฉันเข้าใจมันให้แอตทริบิวต์เริ่มต้น NSFileImmutable YES หรืออะไรทำนองนั้น. ขออภัยไม่สามารถแสดงแหล่งที่มาได้ในขณะนี้ แต่ปัญหาเป็นเรื่องเล็กน้อย
Vadim

จำเป็นต้องตรวจสอบไฟล์หรือไม่
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 ฉันเขียนโค้ดที่คล้ายกันมากใน 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

มันขึ้นอยู่กับคุณ. ไม่จำเป็น
Roman Barzyczak

มีวิธีตรวจสอบว่าไฟล์ยังคงอยู่ก่อน / หลังเรียกใช้ฟังก์ชันเพื่อให้แน่ใจว่าถูกลบออกหรือไม่
luke

1
ใช่แน่ใจ: 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

ใน 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
เพิ่มสิ่งต่อไปนี้ในบรรทัดสุดท้ายแทนเพื่อสั่งให้ลอง ทำ {try filemanager.removeItem (atPath: destinationPath) print ("Deleted")} catch {print ("Not Deleted")}
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) ณ ตอนนี้คุณต้องใช้ do {} catch {} เนื่องจากวิธีการแสดงข้อผิดพลาดแบบเก่าใช้ไม่ได้อีกต่อไป isDeletableFileAtPath () ไม่ใช่ "พ่น" (เช่น "func สาธารณะ removeItemAtPath (path: String) พ่น") ดังนั้นจึงไม่จำเป็นต้อง 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)")
   }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.