2011/05/29

ファイルをZIP圧縮する

ZIPなどのアーカイブファイル形式は、複数のファイル群や巨大な圧縮されていないファイルをネット経由で公開・送受信したい場合に役立ちます。
今回は、NILScriptでZIPファイルを作成する方法について説明します。

ZIPファイルの読み書きを行なうには、ZLibユニットのZIPクラスを使用します。
単に一つのディレクトリ配下のファイルをZIPファイルにするだけなら、以下のようにZIPクラスのcompress()メソッドをZIPファイルとディレクトリのパスを引数にして呼び出すだけです。
require('ZLib').ZIP.compress(zipfile, directory);

以下の例では、正規表現に一致するファイルを除外して、残りのファイルだけを圧縮します。
var exclude=/\\nil\\(release|test\d*)\.ng|\\nil\\users|\\users\\Owner/;
var src=Main.scriptDirectory;
var dest="E:\\www\\public_html\\nil.zip";

try{
    var zip=require('ZLib').ZIP.create(dest);
    (function(from,to){
        for(var f in from.children){
            if(!String(f).match(exclude)){
                println(f.path);
                if(f instanceof Directory){
                    arguments.callee(f, to.directory(f.name).create(f.mtime));
                }else{
                    to.add(f);
                }
            }
        }
    })(src,zip);
}finally{
    free(zip);
}
まず、ZIPファイルのパスを引数にしてZIP.create()を呼び出し、ZIPオブジェクトを取得します。
次に、Directoryオブジェクトのchildrenプロパティで圧縮対象ディレクトリ内のファイル/ディレクトリを列挙し、条件に一致するファイルをZIPファイルに追加していきます。

ZIPファイルの直下にファイルを追加するには、追加したいファイルを表すFileオブジェクトを引数として、ZIPオブジェクトのadd()メソッドを呼び出します。

Directoryオブジェクトを引数にadd()メソッドでを呼び出せば、配下のファイルを全て追加できますが、今回はサブディレクトリ内もフィルタリングしたいので、ZIPファイル内にディレクトリを作成したあと、再帰呼び出しで配下のファイルの処理を行なうことにします。

ZIPファイル内にディレクトリを作成するには、ZIPオブジェクトのdirectory()メソッドでZIPDirectoryオブジェクトを取得し、そのcreate()メソッドを呼び出します。create()メソッドの返り値は、そのZIPDirectoryオブジェクト自身です。
create()メソッドの引数には、格納するディレクトリの更新日時を表すDateオブジェクトを指定できます。

ZIPDirectoryオブジェクトも、ZIPオブジェクトと同様に、add()メソッドでディレクトリ内のファイルとしてファイルを追加したり、directory()メソッドで子ディレクトリを表すZIPDirectoryオブジェクトを取得できるので、共通の関数で再帰処理を行なえます。

処理が完了したら、free()関数でZIPオブジェクトを解放する必要があることに注意して下さい。

この他のZIPファイル読み書き機能については、NILScriptに同梱のdoc\ZLib.txtを参照して下さい。

0 件のコメント:

コメントを投稿