由于flutter允許同名文件存在不同路徑下,當我們項目代碼文件存在復(fù)制粘貼情況的時候,并不會編譯報錯,
重復(fù)文件都會參與編譯,造成調(diào)用的不確定性,導致未知bug.
所以我寫了一個swift腳本,可以篩選出項目中指定路徑下的同名文件,并且輸出json文件到桌面
腳本文件名為 Yann_Scan_duplicateFiles.swift
執(zhí)行腳本 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: "/")
}
// 定義一個函數(shù),用于掃描指定文件夾及其子目錄下的所有文件讹语,并返回同名文件的路徑
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) 的內(nèi)容")
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 {
// 如果該文件路徑已經(jīng)在同名文件的路徑數(shù)組中钙皮,就不再添加
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: ",") {
// 調(diào)用函數(shù)短条,掃描指定文件夾及其子目錄下的所有文件导匣,并輸出同名文件的文件名
let sameFileNamePaths = scanDirectoriesForSameFileName(inFolders: inputFolders)
if sameFileNamePaths.isEmpty {
print("未找到同名文件。")
} else {
// 將結(jié)果轉(zhuǎn)換為 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("無效的輸入茸时。")
}