以 F# 函數式風格重寫 Comiket 檔案名稱格式化工具,展示模式比對、管道運算子與不可變資料流處理。
let parseFilename name =
let result = Regex.Match(name, @"^\(([^)]+)\)\s*\(([^)]+)\)\s*\[([^\]]+)\]\s*(.+)$")
let success = result.Success
let comiketNum = result.Groups.[1].Value
let contentType = result.Groups.[2].Value
let circleName = result.Groups.[3].Value
let itemName = result.Groups.[4].Value
success, comiketNum, contentType, circleName, itemName
let getReformattedFilename name =
let success, comiketNum, contentType, circleName, itemName = parseFilename name
if success then sprintf "(%s)(%s)[%s] %s" comiketNum contentType circleName itemName
else name
let reformatAndRenameDir (dirInfo: DirectoryInfo) =
let destName = getReformattedFilename dirInfo.Name
if dirInfo.Name <> destName then
printfn "%s" destName
dirInfo.MoveTo(Path.Combine(dirInfo.Parent.FullName, destName))
true else false
let reformatAndRenameFile (fileInfo: FileInfo) =
let destName = getReformattedFilename fileInfo.Name
if fileInfo.Name <> destName then
printfn "%s" destName
fileInfo.MoveTo(Path.Combine(fileInfo.DirectoryName, destName))
true else false
let getRootDir () =
match Environment.GetCommandLineArgs() with
| [| _ |] -> DirectoryInfo(Environment.CurrentDirectory)
| _ -> DirectoryInfo(fsi.CommandLineArgs.[1])
let main () =
let root = getRootDir()
Array.iter (fun d -> reformatAndRenameDir d |> ignore) (root.GetDirectories())
Array.iter (fun f -> reformatAndRenameFile f |> ignore) (root.GetFiles())
main()
match ... with 處理命令列參數|> 鏈式資料流(此處用 Array.iter 替代)