Xóa tệp đã chỉ định khỏi thư mục tài liệu


111

Tôi muốn xóa một hình ảnh khỏi thư mục tài liệu ứng dụng của mình. Mã tôi đã viết để xóa hình ảnh là:

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

Nó hoạt động một phần. Mã này xóa tệp khỏi thư mục, nhưng khi tôi kiểm tra nội dung trong thư mục, nó vẫn hiển thị tên hình ảnh ở đó. Tôi muốn xóa hoàn toàn tệp đó khỏi thư mục. Tôi nên thay đổi điều gì trong mã để làm điều tương tự? Cảm ơn


4
Có thể xảy ra lỗi mà bạn đã bỏ qua, hãy thêm phiên bản NSError và kiểm tra nó sau khi removeItemAtPath
Dmitry Shevchenko

1
sử dụng - (BOOL) đường dẫn fileExistsAtPath: (NSString *); để kiểm tra xem hình ảnh có tồn tại hay không, nếu nó trả về CÓ, điều đó có nghĩa là quá trình xóa của bạn không thành công
Guo Luchuan

Chỉ cần kiểm tra nó và nó chắc chắn bị xóa và việc loại bỏ được phản ánh trong contentsOfDirectoryAtPath(tức là không có bộ nhớ đệm thư mục nào liên quan ở đây). Vì vậy, bạn phải có một số lỗi đơn giản khi chơi sẽ trở nên rõ ràng khi bạn nhìn vào NSErrornội dung.
Rob

Câu trả lời:


238

Tôi đã kiểm tra mã của bạn. Nó làm việc cho tôi. Kiểm tra bất kỳ lỗi nào bạn đang gặp phải bằng cách sử dụng mã đã sửa đổi bên dưới

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

Tôi có thể tạo tệp trong thư mục Tài liệu nhưng luôn gặp lỗi khi cố gắng xóa nó. Bạn có bất cứ ý tưởng?
Vadim

Tôi đã giải quyết nó. Vấn đề là: Tôi đã tạo tệp mới mà không có bất kỳ thuộc tính nào và theo tôi hiểu, nó cung cấp thuộc tính mặc định NSFileImmutable YES. Hoặc điều tương tự. Xin lỗi không thể hiển thị nguồn bây giờ. Nhưng vấn đề là nhỏ.
Vadim

Kiểm tra tệp có tồn tại hay không là cần thiết?
Sangram Shivankar

nó xóa tập tin từ thư mục nhưng nó vẫn hiển thị hình ảnh trong hình ảnh của mô phỏng
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)
  }}

Cảm ơn @Anil Varghese, tôi đã viết mã rất giống trong 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)
  }
}

Tại sao làm cho hàm tĩnh?
CalZone

Tuỳ bạn. Không cần thiết
Roman Barzyczak

Có cách nào để kiểm tra xem tệp có còn tồn tại hay không trước / sau khi gọi hàm để đảm bảo rằng nó đã bị xóa?
luke

1
vâng chắc chắn rồi: 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

Trong Swift cả 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)
    }
    }

hoặc Phương pháp này có thể xóa tất cả tệp cục bộ

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
Thêm phần sau vào dòng cuối cùng để thử trực tiếp. do {try filemanager.removeItem (atPath: DestiPath) print ("Đã xóa")} bắt {print ("Chưa được Xóa")}
Abhirajsinh Thakore 27/08/18

5

Thay vì đặt lỗi thành NULL, hãy đặt lỗi thành

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

điều này sẽ cho bạn biết nếu nó thực sự đang xóa tệp


3

Tôi muốn xóa db sqlite của mình khỏi thư mục tài liệu. Xóa sqlite db thành công bằng câu trả lời bên dưới

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

Phiên bản FreeGor được chuyển đổi thành 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

Bạn có thể bảo vệ kép việc xóa tệp của mình bằng NSFileManager.defaultManager (). IsDeletableFileAtPath (PathName) Hiện tại, bạn PHẢI sử dụng do {} catch {} vì các phương pháp lỗi cũ không còn hoạt động. isDeletableFileAtPath () không phải là "ném" (tức là "public func removeItemAtPath (path: String) ném") nên nó không cần do ... catch

let killFile = NSFileManager.defaultManager()

            if (killFile.isDeletableFileAtPath(PathName)){


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

0

Nếu bạn quan tâm đến cách api hiện đại, tránh NSSearchPath và lọc các tệp trong thư mục tài liệu, trước khi xóa, bạn có thể làm như:

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)")
   }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.