【问题标题】:Remove all files from within documentDirectory in Swift从 Swift 中的 documentDirectory 中删除所有文件
【发布时间】:2018-10-05 10:42:04
【问题描述】:

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

接下来,我想允许用户使用一个按钮删除所有文件。在文档中,有一个method to remove items

这是我的代码:

@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


    【解决方案1】:

    只需使用代码作为关注

    将文档目录中的 AudioFile 保存为

    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】:

      试试这个

      func clearAllFile() {
              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.localizedDescription)
              }
          }
      

      【讨论】:

        【解决方案3】:

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

        第二个问题是您将删除Documents 目录本身,而不是目录中的文件,您不鼓励这样做。

        您必须获取目录的 contents 并添加检查,例如仅删除 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。

        【讨论】:

        • 虽然两个赞成的答案都是解决方案,但我选择了这个,因为它允许我在不创建临时目录的情况下达到预期的结果(因此不需要更改我的文件存储方法在代码库中)。
        • 这是删除文件(包括文件夹)的完美解决方案。
        【解决方案4】:

        这是我的扩展,用于从目录中删除所有文件和缓存。

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

        【讨论】:

          猜你喜欢
          • 2018-11-02
          • 2014-08-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多