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

16

我正在制作一款音频应用程序,用户可以使用FileManager将本地存储的文件下载到documentDirectory

接下来,我想在应用中添加一个按钮,让用户能够删除所有文件。在文档中,有一个删除文件方法

这是我的代码:

@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)
        }
    }

很遗憾,这个代码会出错:Ambiguous reference to member 'removeItem(atPath:)'

有更好的方法可以访问documentDirectory并一次性删除目录中的所有文件吗?

5个回答

44

首先,错误发生是因为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)
    for fileURL in fileURLs where fileURL.pathExtension == "mp3" {
        try FileManager.default.removeItem(at: fileURL)   
    }
} catch  { print(error) }

顺带一提:强烈建议始终使用FileManager的与URL相关的API。


1
虽然两个被点赞的答案都是解决方案,但我选择了这个答案,因为它让我能够在不创建临时目录的情况下实现所需的结果(因此不需要更改已经在代码库中的文件存储方法)。 - darkginger
这是一个完美的解决方案,可以删除包括文件夹在内的所有文件。 - Mehul

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

4

只需按以下方式使用代码:

将音频文件保存在文档目录中:

func getDocumentsDirectory() -> URL
    {
        //Get Basic URL
        let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
        /// Enter a Directory Name in which files will be saved
        let dataPath1 = documentsDirectory.appendingPathComponent("folder_name_enter")
        let dataPath = dataPath1.appendingPathComponent("folder inside directory if required (name)")
        //Handler
        do
        {
            try FileManager.default.createDirectory(atPath: dataPath.path, withIntermediateDirectories: true, attributes: nil)
        }
        catch let error as NSError
        {
            print("Error creating directory: \(error.localizedDescription)")
        }
        return dataPath
    }

删除

func clearAllFilesFromTempDirectory()
    {
        let fileManager = FileManager.default
        let dirPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        let tempDirPath = dirPath.appending("/folder_name/\(inside_directoryName)")

        do {
            let folderPath = tempDirPath
            let paths = try fileManager.contentsOfDirectory(atPath: tempDirPath)
            for path in paths
            {
                try fileManager.removeItem(atPath: "\(folderPath)/\(path)")
            }
        }
        catch let error as NSError
        {
            print(error.localizedDescription)
        }
    }

存储方法

getDocumentsDirectory().appendingPathComponent("\(audioName).wav")

删除方法

/// Just call
clearAllFilesFromTempDirectory

2
这是我为清空目录中所有文件和缓存而设计的扩展程序。
// MARK: - FileManager extensions

extension FileManager {
    
    /// Remove all files and caches from directory.
    public static func removeAllFilesDirectory() {
        let fileManager = FileManager()
        let mainPaths = [
            FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).map(\.path)[0],
            FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).map(\.path)[0]
        ]
        mainPaths.forEach { mainPath in
            do {
                let content = try fileManager.contentsOfDirectory(atPath: mainPath)
                content.forEach { file in
                    do {
                        try fileManager.removeItem(atPath: URL(fileURLWithPath: mainPath).appendingPathComponent(file).path)
                    } catch {
                        // Crashlytics.crashlytics().record(error: error)
                    }
                }
            } catch {
                // Crashlytics.crashlytics().record(error: error)
            }
        }
    }
}

0

Swift 5

删除整个文件夹:

如果您想要删除一个完整的文件夹,您可以轻松地执行以下操作:

func deleteFolder(_ folderName: String, completion: () -> Void) {
    let fileManager = FileManager.default
    let directory = fileManager.cachesDirectory().appendingPathComponent(folderName)
    _ = try? fileManager.removeItem(at: directory)
    completion()
}

根据文件名删除特定文件:

这将循环遍历所有文件并删除包含以下内容的所有文件

func removeFiles(containing: String, completion: () -> Void) {
    let fileManager = FileManager.default
    let directory = fileManager.cachesDirectory()
    
    if let fileNames = try? fileManager.contentsOfDirectory(atPath: directory.path) {
        for file in fileNames {
            if file.contains(containing) {
                let filePath = URL(fileURLWithPath: directory.path).appendingPathComponent(file).absoluteURL
                _ = try? fileManager.removeItem(at: filePath)
            }
        }
    }
    completion()
}

您的Swift5代码存在错误:FileManager没有cachesDirectory! - us_david

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接