关于ios:Swift-文件处理-完成文件移动

38次阅读

共计 1724 个字符,预计需要花费 5 分钟才能阅读完成。

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

正文完
 0