31

我正在深入研究 node.js 的 Zlib。我能够使用提供的示例(http://nodejs.org/api/zlib.html#zlib_examples)压缩和解压缩文件,但我找不到更多关于对文件夹执行相同操作的信息?

一种可能性(但我认为是修修补补)是使用node-zip模块并一一添加文件夹的所有文件。但是解压缩时会遇到问题(在这种情况下我会丢失文件夹)。

知道如何使用 Node.js 压缩(然后解压缩)整个文件夹(尊重子焊料层次结构)吗?

谢谢。

4

3 回答 3

31

在@generalhenry 的帮助下,我终于得到了它(请参阅对问题的评论)和

正如评论中提到的,我们需要分两步压缩文件夹:

  1. 将文件夹转换为.tar文件

  2. 压缩.tar文件

为了执行第一步,我需要两个 node.js 模块:

npm install tar
npm install fstream

第一个允许我们创建.tar文件。您可以在此处访问源代码https://github.com/isaacs/node-tar

第二个节点模块将帮助我们读取文件夹并写入文件。关于基本的fsnode.js 模块,我不知道是否可以读取目录(我不是在谈论使用 获取数组中的所有文件fs.readdir,而是处理文件夹中的所有文件及其组织)。

然后,当我将文件夹转换为文件时,.tar我可以使用Gzip().Zlib

这是最终代码:

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模块上缺少文档。我希望这将很快得到改进,因为提供的两个示例讨论了如何从.tar文件中提取内容。

  • 我使用该fstream模块来帮助我处理源目录。可以使用绕过fs吗?我不知道(如果您有想法,请发表评论)。

于 2013-03-20T18:55:03.603 回答
7

提供更新的答案,因为包 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.

于 2020-03-30T19:09:06.887 回答
3

您可以使用tar-stream模块创建 tar 存档。它比 node-tar 更灵活、更简单:

  • 您可以将文件添加到存档(不仅仅是目录,这是 node-tar 的限制)
  • 它适用于普通节点文件系统流(node-tar 奇怪地需要使用 fstream 模块)
  • 它的文档非常完整(node-tar 没有很好的文档记录)
  • 您可以创建存档而无需访问文件系统

创建 tar 存档,然后使用 zlib 对其进行压缩,然后将其写入您想要的任何位置(网络、文件系统等)。

于 2014-09-01T00:39:33.047 回答