如何删除应用程序沙箱中的文件?

时间:2019-05-29 19:25:44

标签: ios swift xcode tableview

我设置了UITableView,其数据源是应用程序的沙箱,因此所有行都填充了使用UIDocumentPicker导入的文件,但我还需要删除这些文件。

删除功能有效,我可以滑动并删除一行以及所有内容,但是文件保留在应用程序的沙箱中,因此,每次导入新文件时,这些行都会被重新填充( TableView 每次导入内容时都会使用先前“已删除”的内容重新加载。

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == UITableViewCell.EditingStyle.delete {
            self.deleteFile()
            importedfiles.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.automatic)
        }

 }

加上代码中已经包含的所有内容,我需要从应用程序的沙箱中删除文件(importedfiles)的功能。

这是到目前为止,我可以删除文件,但只能删除整个目录,这不是我想要的。代码:

   func deleteFile() {
        let dirPaths = FM.urls(for: .documentDirectory, in: .userDomainMask)
        let docsDir = dirPaths[0].path

        if FM.fileExists(atPath: docsDir) {
            do {
                try FM.removeItem(atPath: docsDir)
            } catch {
                print("Could not delete file: \(error)")
            }
        }
    }

编辑:“ importedfiles”是使用UIDocumentPickerViewController导入到应用程序目录(文档)中的文件。然后,TableView使用此数据来创建单元格。

1 个答案:

答案 0 :(得分:0)

将删除方法更改为

func deleteFile(_ url: URL) {
    let fm = FileManager.default
    do {
        try fm.removeItem(at: url)
    } catch {
        print(error)
    }
}

并调用它

if editingStyle == UITableViewCell.EditingStyle.delete {
    self.deleteFile(importedfiles[indexPath.row])
    importedfiles.remove(at: indexPath.row)
    tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.automatic)
}

这应该可以,但是没有错误处理,如果您希望定义返回Result的方法

func deleteFile(_ url: URL) -> Result<Void,Error> {
    let fm = FileManager.default
    do {
        try fm.removeItem(at: url)
        return .success(())
    } catch {
        return .failure(error)
    }
}

并在switch

中处理结果
let result = deleteFile(importedfiles[indexPath.row])
switch result {
case .success:
    //Maybe update array and table view here
case .failure(let error):
     //dislplay error?
}