以下を実現する方法のメモ
- Node.jsのモジュールである
archiver
を使う - 複数のファイル、サブディレクトリ以下のファイルを丸ごと
zip圧縮
する 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();
}