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
が使えず、非同期でフィルタができません。
(これはちょい残念かも)