Welcome 微信登录

首页 / 网页编程 / ASP.NET / 将Comiket物的文件名格式统一化的脚本(F#版)

将Comiket物的文件名格式统一化的脚本(F#版)2010-02-05 javaeye.com RednaxelaFX既然Ruby的简单版和C#的版本都写了,写个F#版来对比一下也不错。

下面的程序逻辑基本上与前一篇的C#版类似,只是在如何抽取出文件名中的各部分的实现用了不同的划分方式:C#版的TryGetRenameName()方法更倾向于直接支持不同的pattern和format;F#版则是直接把pattern和format硬编码到parseFilename和getReformattedFilename函数里了。到底该怎么划分好我也不太肯定,不过在这么小的程序里划分方式好不好体现不出来,或许也不值得多想吧?

ReformatComiketFilenames.fsx

F#代码

#lightopen Systemopen System.IOopen System.Text.RegularExpressionslet parseFilename name =let result = Regex.Match(name, @"^(([^)]+))s*(([^)]+))s*[([^]]+)]s*(.+)$")let success = result.Successlet comiketNum = result.Groups.Item(1).Valuelet contentType = result.Groups.Item(2).Valuelet circleName = result.Groups.Item(3).Valuelet itemName = result.Groups.Item(4).Valuesuccess, comiketNum, contentType, circleName, itemNamelet getReformattedFilename name =let success, comiketNum, contentType, circleName, itemName = parseFilename nameif success thensprintf "(%s)(%s)[%s] %s" comiketNum contentType circleName itemNameelse namelet reformatAndRenameDir (dirInfo : DirectoryInfo) =let name = dirInfo.Namelet destName = getReformattedFilename nameif name <> destName thenprintfn "%s" destNamedirInfo.MoveTo(Path.Combine(dirInfo.Parent.FullName, destName))trueelse falselet reformatAndRenameFile (fileInfo : FileInfo) =let name = fileInfo.Namelet destName = getReformattedFilename nameif name <> destName thenprintfn "%s" destNamefileInfo.MoveTo(Path.Combine(fileInfo.DirectoryName, destName))trueelse falselet getRootDir = fun () ->#if COMPILEDlet args = Environment.GetCommandLineArgs ()#elselet args = fsi.CommandLineArgs#endiflet rootPath =match args with| [| _ |] -> new DirectoryInfo(Environment.CurrentDirectory);| _ -> new DirectoryInfo(args.[1])rootPathlet main = fun () ->let root = getRootDir ()Array.iter (fun dir -> (reformatAndRenameDir dir; ())) (root.GetDirectories())Array.iter (fun file -> (reformatAndRenameFile file; ())) (root.GetFiles())main ()