web-dev-qa-db-ja.com

Node.js-フォルダーのZip / Unzip

Node.jsのZlibに飛び込んでいます。提供された例( http://nodejs.org/api/zlib.html#zlib_examples )を使用してファイルを圧縮および圧縮解除することができましたが、同じことを行う方法の詳細を見つけることができませんでしたフォルダ用?

1つの可能性(ただし、私がいじくり回していると考える)は、node-Zipモジュールとフォルダのすべてのファイルを1つずつ追加します。しかし、解凍すると問題が発生します(この場合、フォルダーが失われます)。

Node.jsを使用してフォルダー全体(サブフォルダー階層を考慮)を圧縮(および圧縮解除)する方法はありますか?

ありがとう。

22
htaidirt

@generalhenry(質問のコメントを参照)の助けを借りて、ようやくそれを手に入れました。

コメントで述べたように、2つのステップでフォルダーを圧縮する必要があります。

  1. フォルダを_.tar_ファイルに変換します

  2. _.tar_ファイルを圧縮する

最初のステップを実行するには、2つのnode.jsモジュールが必要でした。

_npm install tar
npm install fstream
_

最初のファイルでは、_.tar_ファイルを作成できます。ここでソースコードにアクセスできます https://github.com/isaacs/node-tar

2番目のノードモジュールは、フォルダーの読み取りとファイルの書き込みに役立ちます。基本的なfs node.jsモジュールに関して、ディレクトリを読み取ることができるかどうかはわかりません(配列内のすべてのファイルを取得することについては、_fs.readdir_を使用して話しているわけではありません)。フォルダ内のすべてのファイルとその編成を処理します)。

次に、フォルダーを_.tar_ファイルに変換するときに、ZlibGzip()を使用してフォルダーを圧縮できます。

これが最終的なコードです:

_var fstream = require('fstream'),
    tar = require('tar'),
    zlib = require('zlib');

fstream.Reader({ 'path': 'path/to/my/dir/', 'type': 'Directory' }) /* Read the source directory */
.pipe(tar.Pack()) /* Convert the directory to a .tar file */
.pipe(zlib.Gzip()) /* Compress the .tar file */
.pipe(fstream.Writer({ 'path': 'compressed_folder.tar.gz' })); /* Give the output file name */
_

これは、node.jsを使用してフォルダー全体を圧縮するのに役立ちました

さらに2つ:

  • ご覧のとおり、tarモジュールに関するドキュメントが不足しています。提供された2つの例が_.tar_ファイルからコンテンツを抽出する方法について話しているので、これがすぐに改善されることを願っています。

  • fstreamモジュールを使用して、ソースディレクトリを処理しました。これはfsを使用してバイパスできますか?わかりません(アイデアがあればコメントしてください)。

27
htaidirt

tar-stream モジュールを使用して、tarアーカイブを作成できます。その点で、node-tarよりもはるかに柔軟でシンプルです。

  • ファイルをアーカイブに追加できます(node-tarの制限であるディレクトリだけではありません)。
  • 通常のノードファイルシステムストリームで動作します(node-tarは奇妙にfstreamモジュールの使用を必要とします)
  • かなり完全に文書化されています(node-tarは十分に文書化されていません)
  • ファイルシステムにアクセスすることなくアーカイブを作成できます

Tarアーカイブを作成し、zlibを使用して圧縮し、必要な場所(ネットワーク、ファイルシステムなど)に書き込みます。

3
B T

package tar として更新された回答を提供することは、2013年以降に更新されました。

同じ結果を達成するために、コードははるかに単純で簡単です。

const tar = require("tar"); // version ^6.0.1
const fs = require("fs");

tar.c(
  {
    gzip: true // this will perform the compression too
  },
  ["path/to/my/dir/"]
).pipe(fs.createWriteStream('path/to/my/dir.tgz'));

明示的にzlibを使用する必要はありません。

0
Andry