【问题标题】:Deleting files from Documents Directory从文档目录中删除文件
【发布时间】:2023-04-03 11:06:01
【问题描述】:

我将图像保存在文档目录中,并且我允许用户编辑图像,因此如果用户想要更改图像,我将删除以前的图像,然后我将保存新图像。在同一条路径上。

还有我的删除功能:

func deleteItemInDirectory(imageName: String) {
    let fileManager = FileManager.default
    let imagePath = (self.getDirectoryPath() as NSString).appendingPathComponent(imageName)
    do {
        if fileManager.fileExists(atPath: imagePath) {
            try fileManager.removeItem(atPath: imagePath)
            print("Confirmed")
        }
        else {
            print("nothing happened")
        }
    }
    catch let error as NSError {
        print("An error took place: \(error)")
    }
}

当我试图覆盖图像时有功能:

func saveItem() {
    if self.nick != ""{
        self.ShowingEmptyFieldsAlert = false
        let imageName = self.user.imageName!

        self.user.name = self.nick
        self.user.birthday = self.birthday
        if self.pickedImage != nil {
            ImageToDirectory().deleteItemInDirectory(imageName: imageName)
            ImageToDirectory().saveImageToDocumentDirectory(image: self.pickedImage!, filename: imageName)
        }

        try? self.moc.save()
        self.presentationMode.wrappedValue.dismiss()
    }
    else {
        self.ShowingEmptyFieldsAlert = true
    }

当我更改图像时,print("Confirmed") 在控制台上。

而且我认为它可以正常工作,因为用户可以看到新图像并且该图像是为用户显示的。但是当我进入 iPhone 数据设置时,我可以看到每当我更改图像时,我的应用程序数据都在增长。现在我有 100mb 的数据。

为什么它不能正常工作?

【问题讨论】:

    标签: ios swift directory document delete-operator


    【解决方案1】:

    问题解决了!

    我的功能运行良好。我发现每张选择的照片(来自 UIPicker)都保存在我的应用程序的 tmp 文件夹中。

    解决方案是清理 tmp 文件夹: [How to remove tmp directory files of an ios app?

    【讨论】:

      【解决方案2】:

      首先你可以使用下面的函数查看目录的大小,看看那里发生了什么

      func directorySize(url: URL) -> Int64 {
          let contents: [URL]
          do {
              contents = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: [.fileSizeKey, .isDirectoryKey])
          } catch {
              return 0
          }
      
          var size: Int64 = 0
      
          for url in contents {
              let isDirectoryResourceValue: URLResourceValues
              do {
                  isDirectoryResourceValue = try url.resourceValues(forKeys: [.isDirectoryKey])
              } catch {
                  continue
              }
      
              if isDirectoryResourceValue.isDirectory == true {
                  size += directorySize(url: url)
              } else {
                  let fileSizeResourceValue: URLResourceValues
                  do {
                      fileSizeResourceValue = try url.resourceValues(forKeys: [.fileSizeKey])
                  } catch {
                      continue
                  }
      
                  size += Int64(fileSizeResourceValue.fileSize ?? 0)
              }
          }
          return size
      }
      

      同时在文档目录中创建临时文件夹

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

      从临时目录中删除文件:

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

      【讨论】:

      • 好的,我使用了你的 directorySize() 函数,它说 App 目录工作正常 - 当我选择较小的照片时,directorySize() 更小,而不是更大。那么,尽管照片被正确删除,为什么 My DataApp(在 iPhone 设置中)却在不断增长?
      • 你在使用临时文件夹吗?
      • 我已经使用了临时文件夹,但更改图像后 DataApp 仍在增长。这是 saveItem() 函数的问题,因为如果我想删除整个 userProfile,照片肯定会被删除,(我使用的是相同的函数)。但是在改变图片时,图像仍然存在于某处
      • 您建议首选与 URL 相关的 API,这很好。但为什么不使用contentsOfDirectory(atPathremoveItem(atPathcreateDirectory(atPath。还有一些等效的 API 采用 URL 参数。然后你可以摆脱丑陋的 <path> + "/" + <path> 连接。
      猜你喜欢
      • 2011-08-06
      • 2013-02-07
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多