読者です 読者をやめる 読者になる 読者になる

SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

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