TSFileManagerTool.swift 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. //
  2. // TSFileManagerTool.swift
  3. // TSLiveWallpaper
  4. //
  5. // Created by 100Years on 2024/12/26.
  6. //
  7. class TSFileManagerTool {
  8. /// 获取 Video 下载后保存的的文件件路径
  9. static var saveDownVideoPathURL:URL = {
  10. let saveVideoPathURL = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!.appendingPathComponent("livePhoto").appendingPathComponent("saveVideo")
  11. return saveVideoPathURL
  12. }()
  13. /// 获取 Video 临时编辑的文件件路径
  14. static var editLiveVideoPathURL:URL = {
  15. let editVideoPathURL = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!.appendingPathComponent("livePhoto").appendingPathComponent("editVideo")
  16. return editVideoPathURL
  17. }()
  18. /// 获取 Video 编辑后保存的的文件件路径
  19. static var saveLiveVideoPathURL:URL = {
  20. let saveVideoPathURL = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!.appendingPathComponent("livePhoto").appendingPathComponent("saveVideo")
  21. return saveVideoPathURL
  22. }()
  23. /// 获取沙盒 Documents 目录路径
  24. static var documentsDirectory: URL {
  25. return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
  26. }
  27. /// 获取沙盒 Cache 目录路径
  28. static var cacheDirectory: URL {
  29. return FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!
  30. }
  31. /// 获取沙盒 Temporary 目录路径
  32. static var temporaryDirectory: URL {
  33. return FileManager.default.temporaryDirectory
  34. }
  35. static func copyFileWithOverwrite(from sourceURL: URL, to targetURL: URL) {
  36. let fileManager = FileManager.default
  37. do {
  38. removeItem(from: targetURL)
  39. checkFolderAndCreate(from: targetURL)
  40. try fileManager.copyItem(at: sourceURL, to: targetURL)
  41. debugPrint("文件复制成功!")
  42. } catch {
  43. debugPrint("文件复制失败: \(error.localizedDescription)")
  44. }
  45. }
  46. static func removeItem(from sourceURL: URL) {
  47. let fileManager = FileManager.default
  48. do {
  49. // 如果目标路径存在同名文件,先删除旧文件
  50. if fileManager.fileExists(atPath: sourceURL.path) {
  51. try fileManager.removeItem(at: sourceURL)
  52. }
  53. debugPrint("文件删除成功!")
  54. } catch {
  55. debugPrint("文件删除失败: \(error.localizedDescription)")
  56. }
  57. }
  58. /// 移动文件的方法(自动创建目标文件夹)
  59. /// - Parameters:
  60. /// - sourceURL: 文件的源 URL
  61. /// - destinationURL: 目标 URL
  62. /// - Throws: 如果移动失败,会抛出错误
  63. static func moveFile(from sourceURL: URL, to destinationURL: URL) {
  64. let fileManager = FileManager.default
  65. // 检查源文件是否存在
  66. guard fileManager.fileExists(atPath: sourceURL.path) else {
  67. let error = NSError(domain: "FileMoveError", code: 404, userInfo: [NSLocalizedDescriptionKey: "源文件不存在"])
  68. debugPrint(error)
  69. return
  70. }
  71. // 获取目标文件夹的路径
  72. let destinationDirectory = destinationURL.deletingLastPathComponent()
  73. do {
  74. // 如果目标文件夹不存在,创建文件夹
  75. if !fileManager.fileExists(atPath: destinationDirectory.path) {
  76. try fileManager.createDirectory(at: destinationDirectory, withIntermediateDirectories: true, attributes: nil)
  77. }
  78. // 检查目标路径是否已经存在文件
  79. if fileManager.fileExists(atPath: destinationURL.path) {
  80. // 如果需要覆盖,可以选择先删除目标文件
  81. try fileManager.removeItem(at: destinationURL)
  82. }
  83. // 尝试移动文件
  84. try fileManager.moveItem(at: sourceURL, to: destinationURL)
  85. } catch {
  86. debugPrint("尝试移动文件失败: \(error.localizedDescription)")
  87. }
  88. }
  89. static func getFileName(from url: URL, includeExtension: Bool = true) -> String {
  90. if includeExtension {
  91. return url.lastPathComponent
  92. } else {
  93. return url.deletingPathExtension().lastPathComponent
  94. }
  95. }
  96. static func checkFolderAndCreate(from destinationURL: URL){
  97. let fileManager = FileManager.default
  98. let destinationDirectory = destinationURL.deletingLastPathComponent()
  99. // 如果目标文件夹不存在,创建文件夹
  100. if !fileManager.fileExists(atPath: destinationDirectory.path) {
  101. do {
  102. try fileManager.createDirectory(at: destinationDirectory, withIntermediateDirectories: true, attributes: nil)
  103. } catch {
  104. debugPrint("尝试创建文件夹失败: \(error.localizedDescription)")
  105. }
  106. }
  107. }
  108. // MARK: - 文件操作方法
  109. /// 检查文件或文件夹是否存在
  110. static func fileExists(at url: URL) -> Bool {
  111. return FileManager.default.fileExists(atPath: url.path)
  112. }
  113. /// 创建文件夹
  114. static func createDirectory(at url: URL) throws {
  115. if !fileExists(at: url) {
  116. try FileManager.default.createDirectory(at: url, withIntermediateDirectories: true, attributes: nil)
  117. }
  118. }
  119. //获取缓存目录下文件夹路径
  120. static func getCacheSubPath(at url: URL) ->String? {
  121. let array = url.path.components(separatedBy:"/Caches/")
  122. let cashFilePath = array.last
  123. return cashFilePath
  124. }
  125. }
  126. extension String {
  127. var fillCachePath:String{
  128. return TSFileManagerTool.cacheDirectory.appendingPathComponent(self).path
  129. }
  130. var fillCacheURL:URL{
  131. return TSFileManagerTool.cacheDirectory.appendingPathComponent(self)
  132. }
  133. }