Swift 文件处理: 完成文件移动

完成了 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,

不能创建

github repo

你可能感兴趣的:(ios)