web-dev-qa-db-ja.com

Node.jsを使用してディレクトリ全体を圧縮する必要がある

Node.jsを使用してディレクトリ全体を圧縮する必要があります。現在node-Zipを使用していますが、プロセスが実行されるたびに無効なZipファイルが生成されます( このGithubの問題 からわかるように)。

ディレクトリを圧縮できるNode.jsの別のオプションはありますか?

編集: archiver を使用してしまった

writeZip = function(dir,name) {
var Zip = new JSZip(),
    code = Zip.folder(dir),
    output = Zip.generate(),
    filename = ['jsd-',name,'.Zip'].join('');

fs.writeFileSync(baseDir + filename, output);
console.log('creating ' + filename);
};

パラメーターのサンプル値:

dir = /tmp/jsd-<randomstring>/
name = <randomstring>

UPDATE:私が使用した実装について尋ねる人のために、 ここに私のダウンローダーへのリンクがあります

77
commadelimited

私は archiver libを使用することになりました。よく働く。

var file_system = require('fs');
var archiver = require('archiver');

var output = file_system.createWriteStream('target.Zip');
var archive = archiver('Zip');

output.on('close', function () {
    console.log(archive.pointer() + ' total bytes');
    console.log('archiver has been finalized and the output file descriptor has closed.');
});

archive.on('error', function(err){
    throw err;
});

archive.pipe(output);
archive.bulk([
    { expand: true, cwd: 'source', src: ['**'], dest: 'source'}
]);
archive.finalize();
96
commadelimited

私は何か新しいものを示すふりをするのではなく、コードでPromise関数を使用するのが好きな人(私のような人)のために上記の解決策を要約したいだけです。

const archiver = require('archiver');

/**
 * @param {String} source
 * @param {String} out
 * @returns {Promise}
 */
function zipDirectory(source, out) {
  const archive = archiver('Zip', { zlib: { level: 9 }});
  const stream = fs.createWriteStream(out);

  return new Promise((resolve, reject) => {
    archive
      .directory(source, false)
      .on('error', err => reject(err))
      .pipe(stream)
    ;

    stream.on('close', () => resolve());
    archive.finalize();
  });
}

それが誰かを助けることを願っています;)

22
D.Dimitrioglo

すべてのファイルとディレクトリを含めるには:

archive.bulk([
  {
    expand: true,
    cwd: "temp/freewheel-bvi-120",
    src: ["**/*"],
    dot: true
  }
]);

Node-glob( https://github.com/isaacs/node-glob )を使用するため、それと互換性のある一致する式はすべて機能します。

10
Sam Ghaderyan

Archive.bulkは非推奨になりました。これに使用される新しいメソッドは glob です。

var fileName =   'zipOutput.Zip'
var fileOutput = fs.createWriteStream(fileName);

fileOutput.on('close', function () {
    console.log(archive.pointer() + ' total bytes');
    console.log('archiver has been finalized and the output file descriptor has closed.');
});

archive.pipe(fileOutput);
archive.glob("../dist/**/*"); //some glob pattern here
archive.glob("../dist/.htaccess"); //another glob pattern
// add as many as you like
archive.on('error', function(err){
    throw err;
});
archive.finalize();
10
caiocpricci2

これは、フォルダーを1行で圧縮する別のライブラリです。 Zip-local

var zipper = require('Zip-local');

zipper.sync.Zip("./hello/world/").compress().save("pack.Zip");
5
Dreams

これを実現するには、Nodeのネイティブchild_process apiを使用します。

サードパーティのライブラリは必要ありません。 2行のコード。

const child_process = require("child_process");
child_process.execSync(`Zip -r DESIRED_NAME_OF_Zip_FILE_HERE *`, {
  cwd: PATH_TO_FOLDER_YOU_WANT_ZIPPED_HERE
});

同期APIを使用しています。非同期が必要な場合は、child_process.exec(path, options, callback)を使用できます。リクエストをさらに微調整するために、単にCWDを指定するよりも多くのオプションがあります。 exec/execSync docsを参照してください。


注意:この例では、Zipユーティリティがシステムにインストールされていることを前提としています(少なくともOSXに付属しています)。一部のオペレーティングシステムにはユーティリティがインストールされていない場合があります(つまり、AWS Lambdaランタイムにはインストールされていません)。その場合、Zipユーティリティバイナリ here を簡単に取得し、アプリケーションソースコードと一緒にパッケージ化できます(AWS Lambdaの場合はLambdaレイヤーにパッケージ化することもできます)。サードパーティのモジュールを使用する(NPMにはたくさんあります)。 Zipユーティリティは数十年にわたって試行され、テストされているため、前者のアプローチを好みます。

4
Govind Rai

Adm-Zipには、既存のアーカイブを圧縮するだけの問題 があり、https://github.com/cthackers/adm-Zip/issues/64 とバイナリファイルの圧縮。

Node-Zip https://github.com/daraosn/node-Zip/issues/4 で圧縮破損の問題に遭遇しました

node-archiverは圧縮に適しているように見えますが、解凍機能はありません。

3
Xiaoxin

結果を応答オブジェクトにパイプするには(ローカルに保存するのではなく、Zipをダウンロードする必要があるシナリオ)

 archive.pipe(res);

ディレクトリのコンテンツにアクセスするためのサムのヒントは、私にとってはうまくいきました。

src: ["**/*"]
3
Raf

必要なものをカプセル化したこの小さなライブラリを見つけました。

npm install Zip-a-folder

const Zip-a-folder = require('Zip-a-folder');
await Zip-a-folder.Zip('/path/to/the/folder', '/path/to/archive.Zip');

https://www.npmjs.com/package/Zip-a-folder

0

簡単な方法で試すことができます:

Zip-dirをインストールします。

npm install Zip-dir

そしてそれを使用する

var zipdir = require('Zip-dir');

let foldername =  src_path.split('/').pop() 
    zipdir(<<src_path>>, { saveTo: 'demo.Zip' }, function (err, buffer) {

    });
0
Harsha Biyani