【问题标题】:unable to delete file from the app documents folder无法从应用文档文件夹中删除文件
【发布时间】:2017-12-17 23:58:18
【问题描述】:

使用 Swift 3,我正在将视频文件写入文档文件夹。 这是文件的路径。

file:///var/mobile/Containers/Data/Application/D031AB20-CB7E-4B14-9483-E7C3F4C0EC55/Documents/output11:10:04.mov

现在我想使用filemanager 再次删除该文件。我从avassetwriter 检索上面的路径,并使用我之前定义的outputurl 使用文件管理器删除文件。

let fileManager = FileManager.default

   do {
       try fileManager.removeItem(at: (self.assetWriter?.outputURL)!)
      } catch let err {
        print(err)
      }

但我得到没有这样的文件或目录的错误。 使用self.assetWriter?.outputURL.path给我同样的错误。

错误域=NSCocoaErrorDomain Code=4 ""output11/10/04.mov" 不能 被删除。” UserInfo={NSFilePath=/var/mobile/Containers/Data/Application/D031AB20-CB7E-4B14-9483-E7C3F4C0EC55/Documents/output11:10:04.mov, NSUserStringVariant=( 删除 ), NSUnderlyingError=0x174240150 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}

【问题讨论】:

  • 在删除文件之前,请检查该路径是否存在文件?由于您的错误表明该文件在该位置不存在。
  • output11:10:04.mov 是文件名不是 t Error Domain=NSCocoaErrorDomain Code=4 " output11/10/04.mov

标签: ios swift


【解决方案1】:

不要在文件名中使用冒号。

(出于遗留原因)操作系统将它们视为路径分隔符并用斜杠替换它们。

【讨论】:

  • 感谢这是已解决的问题的一部分。但我仍然收到错误消息。文件路径有问题
  • Error Domain=NSCocoaErrorDomain Code=4 "“output12-37-45.mov” couldn’t be removed." UserInfo={NSFilePath=/var/mobile/Containers/Data/Application/FECB3191-7684-4D3E-9F99-120F17D74046/Documents/output12-37-45.mov, NSUserStringVariant=( Remove ), NSUnderlyingError=0x170243c30 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
  • 错误是一样的,但由于另一个错误。现在解决了。
【解决方案2】:

首先检查该文件是否存在于该路径,如果存在则删除它:-

let file_manager = FileManager.init()
        if let url = self.assetWriter?.outputURL{
            if file_manager.fileExists(atPath: url.path){
                if file_manager.isDeletableFile(atPath: url.path){
                    do {
                        try file_manager.removeItem(at: url)
                    } catch let err {
                        print(err.localizedDescription)
                    }
                }
            }
        }

【讨论】:

  • 文件肯定在那里。当我进入iTunes中的应用程序文件夹时,我可以看到它。此代码不会产生任何错误,但也不会删除文件。
【解决方案3】:

从开头删除“file://”字符串。

 let path = documentPathValue.replacingOccurrences(of: "file://", with: "")

完整代码

 func clearAllFilesFromDirectory() {

    let fileManager = FileManager.default
    let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL
    let documentsPath = documentsUrl.path

    do {
        if let documentPathValue = documentsPath{

            let path = documentPathValue.replacingOccurrences(of: "file://", with: "")
            let fileNames = try fileManager.contentsOfDirectory(atPath: "\(path)")
            print("all files in cache: \(fileNames)")

            for fileName in fileNames {

                let tempPath = String(format: "%@/%@", path, fileName)

                //Check for specific file which you don't want to delete. For me .sqlite files
                if !tempPath.contains(".sql") {
                    try fileManager.removeItem(atPath: tempPath)
                } 
            }
        }

    } catch {
        print("Could not clear document directory \(error)")
    }
} 

【讨论】:

  • 这个函数无法为我们解释 file:// 太令人沮丧了。这就像一个浏览器抛出一个错误,从你的 URL 的开头排除“http://”。
  • 我支持这种挫败感。很久以前,我知道,但format: "%@/%@" 是干什么用的?
  • 天哪,不要使用String(format:) 将路径组件连接在一起。这就是 URL 的 API 的用途。