Node.jsを使用してZIPファイルを作成する方法はいくつかあります。
一般的な方法の一つは、archiver
と呼ばれるライブラリを使用することです。以下に、archiver
を使用してZIPファイルを作成する基本的な手順を示します。
使用するパッケージはこちら
https://www.npmjs.com/package/archiver
ドキュメントはこちら
https://www.archiverjs.com/docs/quickstart
実装方法
まず最初に、プロジェクトディレクトリで以下のコマンドを使用してarchiver
パッケージをインストールします
$ npm install archiver --save
ZIP作成の方法
const fs = require('fs');
const path = require('path');
const archiver = require('archiver');
// アーカイバーの初期化
const archive = archiver('zip', {
zlib: { level: 9 } // 圧縮レベルを指定(オプション)
});
// 作成するZIPファイルのパス
const outputZipPath = path.join(__dirname, 'output.zip');
// 出力ストリームの設定
const outputZipStream = fs.createWriteStream(outputZipPath);
outputZipStream.on('close', () => {
console.log('ZIPファイルが作成されました。');
});
archive.on('error', (err) => {
throw err;
});
// ZIPファイル作成、第2引数はZIP展開時のディレクトリ構造
archive.directory(path.join(__dirname, 'files'), 'files');
archive.pipe(outputZipStream);
// アーカイブの終了
archive.finalize();
実行結果
$ ls -1
files
node_modules
package-lock.json
package.json
sample.js
$ node sample.js
ZIPファイルが作成されました。
$ ls -1 output.zip
output.zip
$
コードの例では、archive.directory()
メソッドを使用して files
ディレクトリを output.zip
にまとめています。
必要に応じて、アーカイブにファイルやディレクトリを追加するメソッドを適宜使用してください。
Promise版
const fs = require("fs");
const path = require("path");
const archiver = require("archiver");
const zip = async (dir) => {
const archive = archiver("zip", {
zlib: { level: 9 }
});
const outputZipStream = fs.createWriteStream(
path.join(__dirname, "output.zip")
);
outputZipStream.on("close", () => {
console.log("ZIPファイルが作成されました。");
});
archive.on("error", err => {
throw err;
});
archive.directory(
path.join(__dirname, dir),
dir
);
archive.pipe(outputZipStream);
await archive.finalize();
console.log("finalizeの終了");
};
(async () => {
await zip('files');
})();
finalize()
メソッドはPromiseを返却してくれるのでasync/awaitを使用する事が出来ます。
しかし、ドキュメントに記載されている通り、処理によっては適切に検出できないので注意してください。
インスタンスを終了し、アーカイブ構造への追加を防ぎます (キューは空になるまで続行されます)。
このメソッドを呼び出した直後に、宛先ストリームの end、close、またはfinishイベントが発生する可能性があるため、ストリームの完了を適切に検出するには、事前にリスナーを設定する必要があります。(日本語訳)
https://www.archiverjs.com/docs/archiver#finalize
サンプルコードを実行すると以下のようになります。
$ node sample.js
finalizeの終了
ZIPファイルが作成されました。
コメントを残す