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

问题描述 投票:0回答:5

我正在制作一个音频应用程序,用户可以使用

documentDirectory
下载本地存储到
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)
        }
    }

不幸的是,这不会在构建时出现错误

Ambiguous reference to member 'removeItem(atPath:)'

是否有更好的方法来访问

documentDirectory
并一次性删除目录中的所有文件?

ios swift nsdocumentdirectory
5个回答
45
投票

首先出现这个错误是因为API的签名错误。只是

removeItem(at:)
,没有其他参数。

第二个问题是,您将删除

Documents
目录本身,而不是您不鼓励这样做的目录中 中的文件。

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

let documentsUrl = URL.documentsDirectory

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。


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
投票

斯威夫特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()
}
© www.soinside.com 2019 - 2024. All rights reserved.