无法从应用程序文档文件夹中删除文件

时间:2017-07-13 09:28:02

标签: ios swift

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

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

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

let fileManager = FileManager.default

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

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

  

错误域= NSCocoaErrorDomain代码= 4"“output11 / 10 / 04.mov”无法   被删除。"   的UserInfo = {NSFilePath =的/ var /移动/容器/数据/应用/ D031AB20-CB7E-4B14-9483-E7C3F4C0EC55 /文档/ output11:10:04.mov,   NSUserStringVariant =(       删除),NSUnderlyingError = 0x174240150 {错误域= NSPOSIXErrorDomain代码= 2"没有这样的文件或目录"}}

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

从开始删除“ 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)")
    }
}