完成了 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
,
不能创建
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。