Zip圧縮ファイルの作成(F#)
F#入門に、いいアプローチは?と質問してみたところ
@jsakamoto氏に「定型処理(スクリプト)で有効利用できますよ」と教えて頂きました。
という事で、さっそく、BlackJumboDogの定型処理をF#で書いてみることにしました。
本日は、手始めにZIPファイル生成です。
検索すると、.NETで簡単にZIP圧縮ファイルを作成する方法として下記で詳しく紹介されていました。
【ハウツー】C#でZIPファイルを扱えるDotNetZip
http://journal.mycom.co.jp/articles/2009/08/21/DotNetZip/index.html
上記には、ASP ASPNET C# C++ CompactFramework PHP VB WScriptなどの多数のサンプルが含まれていましたが、ちょうどF#のサンプルは無かったようなので作成することにしました。
おおかたは、パラメータのエラー処理で、ZIP生成部分は、おおむね10行程度となりました。
すいません、まだ、F#ぜんぜん、分かってません。突っ込んでやってください。
open System open System.IO open Ionic.Zip //エラーメッセージ表示(終了) let Usage (msg:string) = if( msg <> "" ) then printfn "%s" msg printfn "usage:n CreateZip <ZipFileToCreate> <directory>" Environment.Exit(1) //Zipファイルへの追加 let rec Append(zip:ZipFile,dir:string) = for f in Directory.GetDirectories(dir) do Append(zip,f)//ディレクトリがある場合は再帰で処理する for f in Directory.GetFiles(dir) do printfn "Adding %s..." f zip.AddFile(f) |> ignore //パラメータ取得 let args = Environment.GetCommandLineArgs() //パラメータの正当性確認 if(args.Length <> 3) then Usage("パラメータに誤りがあります。") let src = args.[2] if(not (Directory.Exists(src))) then Usage("ディレクトリが存在しません。") let dst = if args.[1].EndsWith(".zip") then args.[1] else args.[1]+".zip" //拡張子の強制追加 if(File.Exists(dst)) then Usage("zipファイルが存在します。") //Zipファイルの生成 let zip = new ZipFile() Append(zip,src) zip.Save(dst)
http://www.sapporoworks.ne.jp/img/CreateZip-fsharp.zip
※参考
「スクリプト言語としてのF# - .fsx は強力だった! 」
http://devadjust.exblog.jp/12700495/
@jsakamoto氏による、CLR/HでのLT