Node.jsでZIPファイルの作成 | archiverライブラリの使い方

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ファイルが作成されました。