实现了 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,

不能创立

github repo