Node.jsでのZip解凍

node-zipモジュールで簡単に操作できました。

インストール

$ mkdir zip_sample
$ cd zip_sample/
$ npm init
$ npm install node-zip --save

app,js

引数にファイル名を渡すと、Zipファイル内のファイルを出力します。
ファイルの実体はdataに入ってますが、元データが画像のため、ここでは出力していません。
※fs.readFileでエンコードを'binary'にしないと、ちゃんと読込めません。

var fs = require('fs');
var file = process.argv[2];

fs.readFile(file, 'binary', function(err, data) {
	if (err) throw err;
	var zip = new require('node-zip')(data, {base64: false, checkCRC32: true});
	for (var i in zip.files) {
		for (var j in zip.files[i]) {
			if (j !== 'data') {
				console.log(j + ':', zip.files[i][j]);
			}
		}
	}
});

Zipファイルの作成

元の階層は以下。

$ find sample
sample
sample/image1.jpg
sample/image2.jpg
$ zip sample.zip sample/*
  adding: sample/image1.jpg (deflated 1%)
  adding: sample/image2.jpg (deflated 2%)
$ ls sample.zip 
sample.zip
$ zipinfo sample.zip 
Archive:  sample.zip   99443 bytes   2 files
-rwxr-xr-x  3.0 unx    44842 bx defN 18-Nov-11 20:59 sample/image1.jpg
-rwxr-xr-x  3.0 unx    55630 bx defN 18-Nov-11 20:59 sample/image2.jpg
2 files, 100472 bytes uncompressed, 99097 bytes compressed:  1.4%

実行結果

$ node app.js sample.zip 
name: sample/
options: { dir: true,
  base64: false,
  binary: false,
  date: Sat Nov 03 2012 15:34:31 GMT+0900 (JST) }
name: sample/image1.jpg
options: { binary: true,
  date: Fri Nov 18 2011 20:59:42 GMT+0900 (JST),
  dir: false,
  base64: false }
name: sample/image2.jpg
options: { binary: true,
  date: Fri Nov 18 2011 20:59:56 GMT+0900 (JST),
  dir: false,
  base64: false }