实现了 Swift 文件解决: 强迫症文本解析 之后,
就能够挪动文件了
背景:
学习 AudioKit/AudioKit 的源代码,有一个库 AudioKit/Cookbook,
他的例子都在一层,批改调试不不便,
建设分层的物理文件夹,再建设分层的 Xcode 工程逻辑目录,会不便很多
思路
前文曾经解析进去,须要的文件夹名称,和对应的构造体名
( SwiftUI 中的 View 是构造体,
个别的 View 是 class )
通过查找,把对应的构造体名,换成对应的文件门路,
创立文件夹,挪动文件,出工
代码实现
命令行程序中,采纳了这个库 JohnSundell/Files
从类名到文件门路
先介绍下 classNameResult 的数据结构,
classNameResult 是一个二维数组,
他的元素 element[0]
是文件夹名称,
他的元素 element[1...]
是对应的 View 构造体名
let outCnt = classNameResult.countvar result = [[File]](repeating: [File](), count: outCnt)// 间接指定,须要解决的文件夹门路let path = "\(NSHomeDirectory())/Downloads/Cookbook-main 2/Cookbook/Cookbook/Recipes"let folder = try Folder(path: path)// while 循环之前,个别 var i = 0// 这里,后面的代码 i 循环过了, // i 重置为 0, 接着作循环i = 0// 3 层循环while i < outCnt { // 对于每一个 destination 文件夹 var j = 1 let innerCnt = classNameResult[i].count while j < innerCnt{ // 对于每一个须要解决的构造体名称 third: for file in folder.files { // 对于本来存在的文件夹,外面的每一个文件 do { // swift 读取文件内容 let content = try String(contentsOfFile: file.path, encoding: .utf8) // swift 读取文件内容蕴含 if content.contains("struct \(classNameResult[i][j])"){ result[i].append(file) break third } } catch { print(error) } } j += 1 } i += 1}
创立文件夹,与挪动文件
i = 0let manager = FileManager.defaultwhile i < outCnt { // 先创立文件夹 let folderPath = path + "/\(classNameResult[i][0])" do { try manager.createDirectory(atPath: folderPath, withIntermediateDirectories: false, attributes: nil) } catch { fatalError() } let destinationFolder = try Folder(path: folderPath) for tbdFile in result[i]{ // 判断存不存在 // 可能一个文件外面,有多个构造体, // 解决后面的构造体,把文件挪动了 // 解决到前面的时候,该文件就不存在了 if manager.fileExists(atPath: tbdFile.path){ try tbdFile.move(to: destinationFolder) } } i += 1}
创立文件夹办法
func createDirectory(atPath path: String, withIntermediateDirectories createIntermediates: Bool, attributes: [FileAttributeKey : Any]? = nil) throws
其中第二个参数
withIntermediateDirectories
例子:
存在一个门路, path
创立文件夹 path + "/A/B"
- 设置为
true
,
可能创立, 相当于强制创立文件夹
B 的父文件夹本来不存在,那就创立 A,创立 B
- 设置为
false
,
不能创立