在Swift中从documentDirectory中删除所有文件

dar*_*ger 4 ios nsdocumentdirectory swift

我正在制作音频应用,用户可以下载本地存储到documentDirectoryusing中的文件FileManager

接下来,我想允许用户使用一个按钮删除所有文件。在文档中,有一种删除项目方法

这是我的代码:

@IBAction func deleteDirectoryButton(_ sender: Any) {

    let documentsUrl =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

        do {
            try FileManager.default.removeItem(at: documentsUrl, includingPropertiesForKeys: nil, options: [])

        } catch let error {
            print(error)
        }
    }
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不会出错Ambiguous reference to member 'removeItem(atPath:)'

有没有更好的方法来一次访问documentDirectory和从目录中删除所有文件?

vad*_*ian 8

首先发生错误是因为API的签名错误。只是removeItem(at:)没有其他参数。

第二个问题是,你要删除该Documents目录本身,而不是文件,你从这样做劝阻的目录。

您必须获取目录的内容并添加检查,例如仅删除MP3文件。更好的解决方案是使用子文件夹。

let documentsUrl =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

do {
    let fileURLs = try FileManager.default.contentsOfDirectory(at: documentsUrl,
                                                               includingPropertiesForKeys: nil,
                                                               options: [.skipsHiddenFiles, .skipsSubdirectoryDescendants])
    for fileURL in fileURLs {
        if fileURL.pathExtension == "mp3" {
            try FileManager.default.removeItem(at: fileURL)
        }
    }
} catch  { print(error) }
Run Code Online (Sandbox Code Playgroud)

旁注:强烈建议始终使用与URL相关的API FileManager


iPa*_*esh 5

尝试这个

func clearAllFiles() {
    let fileManager = FileManager.default
        
    let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
        
    print("Directory: \(paths)")
        
    do {
        let fileName = try fileManager.contentsOfDirectory(atPath: paths)
            
        for file in fileName {
            // For each file in the directory, create full path and delete the file
            let filePath = URL(fileURLWithPath: paths).appendingPathComponent(file).absoluteURL
            try fileManager.removeItem(at: filePath)
        }
    } catch let error {
        print(error)
    }
}
Run Code Online (Sandbox Code Playgroud)