Zipアーカイブを作成し、node.jsで解凍します。ノードの実装が見つかりません。助けてください。
node-coreにはZip機能が組み込まれています: http://nodejs.org/api/zlib.html
それらを使用します:
var zlib = require('zlib');
var gzip = zlib.createGzip();
var fs = require('fs');
var inp = fs.createReadStream('input.txt');
var out = fs.createWriteStream('input.txt.gz');
inp.pipe(gzip).pipe(out);
最終的にはこのようにしました(Expressを使用しています)。特定のディレクトリ(SCRIPTS_PATH)上のすべてのファイルを含むZipを作成しています。
これはMac OS X Lionでしかテストしていませんが、CygwinがインストールされているLinuxとWindowsでも問題なく動作すると思います。
var spawn = require('child_process').spawn;
app.get('/scripts/archive', function(req, res) {
// Options -r recursive -j ignore directory info - redirect to stdout
var Zip = spawn('Zip', ['-rj', '-', SCRIPTS_PATH]);
res.contentType('Zip');
// Keep writing stdout to res
Zip.stdout.on('data', function (data) {
res.write(data);
});
Zip.stderr.on('data', function (data) {
// Uncomment to see the files being added
//console.log('Zip stderr: ' + data);
});
// End the response on Zip exit
Zip.on('exit', function (code) {
if(code !== 0) {
res.statusCode = 500;
console.log('Zip process exited with code ' + code);
res.end();
} else {
res.end();
}
});
});
node-Zip npmモジュールを試すことができます。
JSZipをノードに移植して、Zipファイルを圧縮/圧縮解除します。
archiver モジュールを使用できます。これは私にとって非常に役に立ちました。ここに例を示します。
var Archiver = require('archiver'),
fs = require('fs');
app.get('download-Zip-file', function(req, res){
var archive = Archiver('Zip');
archive.on('error', function(err) {
res.status(500).send({error: err.message});
});
//on stream closed we can end the request
res.on('close', function() {
console.log('Archive wrote %d bytes', archive.pointer());
return res.status(200).send('OK').end();
});
//set the archive name
res.attachment('file-txt.Zip');
//this is the streaming magic
archive.pipe(res);
archive.append(fs.createReadStream('mydir/file.txt'), {name:'file.txt'});
//you can add a directory using directory function
//archive.directory(dirPath, false);
archive.finalize();
});
解凍のみが必要な場合、 node-zipfile は node-archive よりも軽量に見えます。それは間違いなく小さな学習曲線を持っています。
7-Zipの周りに自分のラッパーを配置するのが最も簡単であることがわかりましたが、ランタイム環境で使用できるZipまたはコマンドラインZipツールを簡単に使用できます。この特定のモジュールは、1つのことだけを行います。ディレクトリを圧縮します。
const { spawn } = require('child_process');
const path = require('path');
module.exports = (directory, zipfile, log) => {
return new Promise((resolve, reject) => {
if (!log) log = console;
try {
const zipArgs = ['a', zipfile, path.join(directory, '*')];
log.info('Zip args', zipArgs);
const zipProcess = spawn('7z', zipArgs);
zipProcess.stdout.on('data', message => {
// received a message sent from the 7z process
log.info(message.toString());
});
// end the input stream and allow the process to exit
zipProcess.on('error', (err) => {
log.error('err contains: ' + err);
throw err;
});
zipProcess.on('close', (code) => {
log.info('The 7z exit code was: ' + code);
if (code != 0) throw '7Zip exited with an error'; // throw and let the handler below log it
else {
log.info('7Zip complete');
return resolve();
}
});
}
catch(err) {
return reject(err);
}
});
}
上記のコードをzipdir.js
に保存したと仮定して、このように使用します。 3番目のlog
パラメーターはオプションです。カスタムロガーがある場合に使用します。または、不快なログステートメントを完全に削除します。
const zipdir = require('./zipdir');
(async () => {
await zipdir('/path/to/my/directory', '/path/to/file.Zip');
})();
ファイルの圧縮に「アーカイバ」を使用しました。以下は、使用方法を示すStackoverflowリンクの1つです。 アーカイバでファイルを圧縮するためのStackoverflowリンク
ライブラリを使用/学習したくない場合は、 ノードを使用して子プロセスを実行してZipコマンドラインツールを制御します
Emmermanが言及したようなライブラリを学ぶことをお勧めしますが
これは、メモリ内のZipアーカイブを読み取り、作成、変更するためのJavaScript専用のライブラリです。
見た目はいいですが、少しバグがあります。テキストファイルの解凍に問題がありました。