由于flutter允许同名文件存在不同路径下,当我们项目代码文件存在复制粘贴情况的时候,并不会编译报错,
重复文件都会参与编译,造成调用的不确定性,导致未知bug.
所以我写了一个swift脚本,可以筛选出项目中指定路径下的同名文件,并且输出json文件到桌面
脚本文件名为 Yann_Scan_duplicateFiles.swift
执行脚本 swift /Users/yann_dev/Desktop/Yann_Scan_duplicateFiles.swift
源代码如下
import Foundation
// 清理文件路径中的多余斜线
func cleanFilePath(_ path: String) -> String {
let components = path.components(separatedBy: "/")
return components.filter { !$0.isEmpty }.joined(separator: "/")
}
// 定义一个函数,用于扫描指定文件夹及其子目录下的所有文件,并返回同名文件的路径
func scanDirectoriesForSameFileName(inFolders folders: [String]) -> [String: [String]] {
var sameFileNamePaths = [String: [String]]()
let fileManager = FileManager.default
for folder in folders {
guard let enumerator = fileManager.enumerator(atPath: folder) else {
print("无法获取文件夹 \(folder) 的内容")
continue
}
for case let element as String in enumerator {
let filePath = "\(folder)/\(element)"
var isDirectory: ObjCBool = false
if fileManager.fileExists(atPath: filePath, isDirectory: &isDirectory) && !isDirectory.boolValue {
let fileName = URL(fileURLWithPath: filePath).lastPathComponent
let cleanedPath = cleanFilePath(filePath)
if sameFileNamePaths[fileName] == nil {
sameFileNamePaths[fileName] = [cleanedPath]
} else {
// 如果该文件路径已经在同名文件的路径数组中,就不再添加
if !sameFileNamePaths[fileName]!.contains(cleanedPath) {
sameFileNamePaths[fileName]?.append(cleanedPath)
}
}
}
}
}
// 只保留至少有两个路径的文件
sameFileNamePaths = sameFileNamePaths.filter { $0.value.count > 1 }
return sameFileNamePaths
}
// 获取当前日期时间,并格式化为年月日-时分秒
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyyMMdd-HHmmss"
let currentDateAndTime = dateFormatter.string(from: Date())
// 获取用户输入的文件夹路径列表
print("请输入要扫描的文件夹路径,用逗号分隔:")
if let inputFolders = readLine()?.components(separatedBy: ",") {
// 调用函数,扫描指定文件夹及其子目录下的所有文件,并输出同名文件的文件名
let sameFileNamePaths = scanDirectoriesForSameFileName(inFolders: inputFolders)
if sameFileNamePaths.isEmpty {
print("未找到同名文件。")
} else {
// 将结果转换为 JSON 格式
do {
let desktopURL = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first!
let jsonFileName = "\(currentDateAndTime).json"
let jsonFileURL = desktopURL.appendingPathComponent(jsonFileName)
let jsonData = try JSONSerialization.data(withJSONObject: sameFileNamePaths, options: [.prettyPrinted, .withoutEscapingSlashes])
try jsonData.write(to: jsonFileURL)
print("JSON 文件已保存到桌面:\(jsonFileURL.path)")
} catch {
print("保存 JSON 文件时出错:\(error)")
}
}
} else {
print("无效的输入。")
}