【问题标题】:Delete files from directory inside Document directory?从 Document 目录中的目录中删除文件?
【发布时间】:2015-12-26 17:02:57
【问题描述】:

我创建了一个临时目录来存储一些文件:

//MARK: -create save delete from directory
func createTempDirectoryToStoreFile(){
    var error: NSError?
    let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
    let documentsDirectory: AnyObject = paths[0]
    tempPath = documentsDirectory.stringByAppendingPathComponent("Temp")

    if (!NSFileManager.defaultManager().fileExistsAtPath(tempPath!)) {

        NSFileManager.defaultManager() .createDirectoryAtPath(tempPath!, withIntermediateDirectories: false, attributes: nil, error: &error)
   }
}

没关系,现在我想删除目录中的所有文件...我尝试如下:

func clearAllFilesFromTempDirectory(){

    var error: NSErrorPointer = nil
    let dirPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! String
    var tempDirPath = dirPath.stringByAppendingPathComponent("Temp")
    var directoryContents: NSArray = fileManager.contentsOfDirectoryAtPath(tempDirPath, error: error)!

    if error == nil {
        for path in directoryContents {
            let fullPath = dirPath.stringByAppendingPathComponent(path as! String)
            let removeSuccess = fileManager.removeItemAtPath(fullPath, error: nil)
        }
    }else{

        println("seomthing went worng \(error)")
    }
}

我注意到文件仍然存在...我做错了什么?

【问题讨论】:

  • 你应该更新你的 Xcode。
  • 否则你会被甩在后面。你应该至少使用苹果商店的版本
  • 我不明白你???真的是xcode版本的原因
  • 那是因为你的代码不会在大多数人的机器上编译
  • 哦,谢谢...今晚会更新

标签: ios swift nsfilemanager nsdocumentdirectory


【解决方案1】:

从应用文档文件夹中删除文件的简单函数。

func removeItem(_ relativeFilePath: String) {
    guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
    let absoluteFilePath = documentsDirectory.appendingPathComponent(relativeFilePath)
    try? FileManager.default.removeItem(at: absoluteFilePath)
}

用法:

removeItem("path/to/file.txt")

【讨论】:

    【解决方案2】:

    经过研究,我找到了这个完美的解决方案,

    您可以删除所有文件和文件夹,这将跳过隐藏文件(例如,.DS_Store)

    func clearCache(){
        let fileManager = FileManager.default
        do {
            let documentDirectoryURL = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
            let fileURLs = try fileManager.contentsOfDirectory(at: documentDirectoryURL, includingPropertiesForKeys: nil, options: .skipsHiddenFiles)
            for url in fileURLs {
               try fileManager.removeItem(at: url)
            }
        } catch {
            print(error)
        }
    }
    

    【讨论】:

      【解决方案3】:

      从文档目录中删除所有文件:Swift 4

      func clearAllFile() {
          let fileManager = FileManager.default
          let myDocuments = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
          do {
              try fileManager.removeItem(at: myDocuments)
          } catch {
              return
          }
      }
      

      【讨论】:

      • 这与过去 3 年发布的其他 6 个答案有何不同?添加一些解释以说明这是一个有用的答案。
      • 这个例子很有用,因为它从 documentDirectory 而不是缓存或 tempDirectory 中删除文件。
      【解决方案4】:

      在文档目录中创建临时文件夹 (Swift 4)

      func getDocumentsDirectory() -> URL {
              //        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
              //        return paths[0]
      
              let fileManager = FileManager.default
              if let tDocumentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first {
                  let filePath =  tDocumentDirectory.appendingPathComponent("MY_TEMP")
                  if !fileManager.fileExists(atPath: filePath.path) {
                      do {
                          try fileManager.createDirectory(atPath: filePath.path, withIntermediateDirectories: true, attributes: nil)
                      } catch {
                          NSLog("Couldn't create folder in document directory")
                          NSLog("==> Document directory is: \(filePath)")
                          return fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
                      }
                  }
      
                  NSLog("==> Document directory is: \(filePath)")
                  return filePath
              }
              return fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
          }
      

      从临时目录中删除文件:(Swift 4)

      func clearAllFilesFromTempDirectory(){        
              let fileManager = FileManager.default
              do {
                  let strTempPath = getDocumentsDirectory().path
                  let filePaths = try fileManager.contentsOfDirectory(atPath: strTempPath)
                  for filePath in filePaths {
                      try fileManager.removeItem(atPath: strTempPath + "/" + filePath)
                  }
              } catch {
                  print("Could not clear temp folder: \(error)")
              }
          }
      

      【讨论】:

        【解决方案5】:

        使用文件

        https://github.com/JohnSundell/Files

            do {
                for folder:Folder in (FileSystem().documentFolder?.subfolders)! {
                    try folder.delete()
                }
            } catch _ {
                print("Error")
            }
        

        【讨论】:

          【解决方案6】:

          Swift 4.0 示例,从文档目录中的示例文件夹“diskcache”中删除所有文件。我发现上面的例子不清楚,因为它们使用了NSTemporaryDirectory() + filePath,它不是“url”样式。为了您的方便:

              func clearDiskCache() {
                  let fileManager = FileManager.default
                  let myDocuments = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
                  let diskCacheStorageBaseUrl = myDocuments.appendingPathComponent("diskCache")
                  guard let filePaths = try? fileManager.contentsOfDirectory(at: diskCacheStorageBaseUrl, includingPropertiesForKeys: nil, options: []) else { return }
                  for filePath in filePaths {
                      try? fileManager.removeItem(at: filePath)
                  }
              }
          

          【讨论】:

          • 很好,这对 swift 4 很有帮助,可以确认它有效!
          【解决方案7】:

          如果有人需要最新的 Swift / Xcode 版本:这里是一个从临时文件夹中删除所有文件的示例:

          Swift 2.x:

          func clearTempFolder() {
              let fileManager = NSFileManager.defaultManager()
              let tempFolderPath = NSTemporaryDirectory()
              do {
                  let filePaths = try fileManager.contentsOfDirectoryAtPath(tempFolderPath)
                  for filePath in filePaths {
                      try fileManager.removeItemAtPath(tempFolderPath + filePath)
                  }
              } catch {
                  print("Could not clear temp folder: \(error)")
              }
          }
          

          Swift 3.xSwift 4:

          func clearTempFolder() {
              let fileManager = FileManager.default
              let tempFolderPath = NSTemporaryDirectory()
              do {
                  let filePaths = try fileManager.contentsOfDirectory(atPath: tempFolderPath)
                  for filePath in filePaths {
                      try fileManager.removeItem(atPath: tempFolderPath + filePath)
                  }
              } catch {
                  print("Could not clear temp folder: \(error)")
              }
          }
          

          【讨论】:

          • 为什么要将“tempFolderPath”与“filePath”连接起来,因为“filePath 已经是文件夹中列出的项目的完整路径?只需执行“try fileManager.removeItem(atPath: filePath)”就足够了我想。
          • @Lapinou 他正在删除文件夹的内容。
          • @BlindNinja 是的 :)
          • @joern 这个答案让我头疼不已!!!!!!!!!这次真是万分感谢!!!!!!!!!!!!!!!!!!!!! :)
          【解决方案8】:

          斯威夫特 3

           func clearTempFolder() {
              let fileManager = FileManager.default
              let tempFolderPath = NSTemporaryDirectory()
          
              do {
                  let filePaths = try fileManager.contentsOfDirectory(atPath: tempFolderPath)
                  for filePath in filePaths {
                      try fileManager.removeItem(atPath: NSTemporaryDirectory() + filePath)
                  }
              } catch let error as NSError {
                  print("Could not clear temp folder: \(error.debugDescription)")
              }
          }
          

          【讨论】:

            【解决方案9】:

            两件事,使用temp 目录,第二个将错误传递给fileManager.removeItemAtPath 并将其放入 if 以查看失败的原因。此外,您不应该检查是否设置了错误,而是检查方法是否有返回数据。

            func clearAllFilesFromTempDirectory(){
            
                var error: NSErrorPointer = nil
                let dirPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! String
                var tempDirPath = dirPath.stringByAppendingPathComponent("Temp")
                var directoryContents: NSArray = fileManager.contentsOfDirectoryAtPath(tempDirPath, error: error)?
            
                if directoryContents != nil {
                    for path in directoryContents {
                        let fullPath = dirPath.stringByAppendingPathComponent(path as! String)
                        if fileManager.removeItemAtPath(fullPath, error: error) == false {
                            println("Could not delete file: \(error)")
                        }
                    }
                } else {
                    println("Could not retrieve directory: \(error)")
                }
            }
            

            要获得正确的临时目录,请使用NSTemporaryDirectory()

            【讨论】:

            • 感谢我收到此错误,因为无法删除文件:0x0000000000000000
            • 嗯,这是一个空指针,你能得到fullPath中排序的路径吗?也许那里有问题。
            • 按照最新的 swift ,使用try fileManager.removeItem(atPath: path)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-04-03
            • 2015-01-20
            • 1970-01-01
            • 2012-05-14
            • 2012-01-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多