Node.jsでzipファイルを作成する

以下を実現する方法のメモ

  1. Node.jsのモジュールであるarchiverを使う
  2. 複数のファイル、サブディレクトリ以下のファイルを丸ごとzip圧縮する
  3. date-utilsモジュールを使って、日付を生成してファイル名とする

ポイントはbulk()メソッドを使うのと、finalize()でzip圧縮が実行されて、完了すると、紐付けたストリームのcloseイベントが発火することである。

bulkメソッドに指定するパラメータはcwdプロパティに圧縮したいファイルのディレクトリを指定し、destプロパティにzipファイル内のディレクトリ構成を指定する。ディレクトリに階層があっても自動的に作成される。

var archiver = require('archiver');
var fs = require('fs');
require('date-utils');
 
var zip = function(){
     
    // zipファイル名作成
    var dt = new Date();
    var date_str = dt.toFormat("YYYY-MM-DD-HH24-MI-SS");
    var zip_file_name = "/temp/" + date_str + ".zip";
     
    // zipファイルのストリームを生成して、archiverと紐付ける
    var archive = archiver.create( 'zip', {} );
    var output = fs.createWriteStream( zip_file_name );
    archive.pipe(output);
     
    // bulkメソッドで、対象となるファイルディレクトリを指定する
    archive.bulk([
        {
            expand:true,
            cwd: "/temp/dir1/",
            src:["**/*"],
            dest: "/hoge/dir1/",
            dot:true
        },
        {
            expand:true,
            cwd: "/temp/dir2/",
            src:["**/*"],
            dest: "/hoge/dir2/",
            dot:true
        }
    ]);
     
    // archive.finalize()で、zip圧縮完了すると、
    // ストリームのクローズイベントが発火する
    output.on("close", function(){
         
        // zipファイルのサイズ
        var archive_size = archive.pointer() + " total bytes";
         
    });
 
    // zip圧縮実行
    archive.finalize();
     
}