LoginSignup
1
0

More than 3 years have passed since last update.

ArchiverがZIPに含めるファイルをフィルタする

Posted at

NodeモジュールArchiverは、ディレクトリをZIP圧縮するとき、ZIPに含めるファイルをフィルタすることができます。
(できないと思い込んでて、普通にできた。。)

ZIP圧縮するディレクトリ

以下のディレクトリをZIP圧縮するとします。

ZIP圧縮するディレクトリ
somedir
│  file1.txt
│
├─dir1
│      file2.jpg
│      file3.txt
│
└─dir2
        file4.jpg
        file5.txt

プログラム

プログラムは以下になります。
ディレクトリをZIP圧縮するためにdirectory関数を使いますが、第3引数にフィルタする関数を渡せます。
フィルタする関数の引数には、ZIP圧縮に含めるフォルダ・ファイルのデータが渡されます。
このデータをみて、含める場合データを返し、含めない場合falseを返します。
サンプルでは拡張子.txtのファイルを含めないようにしています。

サンプル
const fs = require('fs')
const path = require('path')
const archiver = require('archiver')

const output = fs.createWriteStream(__dirname + '/somedir.zip')
const archive = archiver('zip', {
  zlib: { level: 9 }
})

output.on('close', function() {
  console.log('finish')
})

archive.pipe(output)

archive.directory('somedir', 'somedir', filter)

archive.finalize()

function filter(entry) {
  if (path.extname(entry.name) === '.txt') {
    // zipに含めない場合falseを返す
    return false
  } else {
    // zipに含める
    return entry
  }
}

ZIP圧縮されたディレクトリの中身

ZIP圧縮されたディレクトリを解凍し、中身を見てみると、以下になります。
拡張子.txtのファイルはZIPに含まれていません。

解凍したディレクトリ
somedir
├─dir1
│      file2.jpg
│
└─dir2
        file4.jpg

非同期でフィルタできない

directory関数に渡すフィルタ関数ですが、Promiseを返せません。
async/awaitが使えず、非同期でフィルタができません。
(これはちょい残念かも)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0