实现了 Swift 文件解决:强迫症文本解析 之后,
就能够挪动文件了
背景:
学习 AudioKit/AudioKit 的源代码,有一个库 AudioKit/Cookbook,
他的例子都在一层,批改调试不不便,
建设分层的物理文件夹,再建设分层的 Xcode 工程逻辑目录,会不便很多
思路
前文曾经解析进去,须要的文件夹名称,和对应的构造体名
(SwiftUI 中的 View 是构造体,
个别的 View 是 class )
通过查找,把对应的构造体名,换成对应的文件门路,
创立文件夹,挪动文件,出工
代码实现
命令行程序中,采纳了这个库 JohnSundell/Files
从类名到文件门路
先介绍下 classNameResult 的数据结构,
classNameResult 是一个二维数组,
他的元素 element[0]
是文件夹名称,
他的元素 element[1...]
是对应的 View 构造体名
let outCnt = classNameResult.count
var 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 = 0
let manager = FileManager.default
while 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
,
不能创立