【问题标题】:Node.js - Zip/Unzip a folderNode.js - 压缩/解压缩文件夹
【发布时间】:2013-03-09 22:53:46
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • zlib 只是压缩,你想 tar 一个文件夹然后压缩它,整个 tar.gz 的东西,试试github.com/isaacs/node-tar
  • 哦,我明白了!因此,我需要分两步完成:1/ 将文件夹转换为 .tar 文件,然后 2/ 使用 Zlib 将 .tar 文件压缩为 .tar.gznode-tar 模块没有很好的文档记录,您还有其他资源吗?
  • 我看了一下,找到的最好的是github.com/cthackers/adm-zip

标签: node.js zlib


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在@generalhenry 的帮助下,我终于明白了(请参阅有关问题的 cmets)和

    如cmets中所说,我们需要分两步压缩文件夹:

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

    2. 压缩.tar文件

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

    npm install tar
    npm install fstream
    

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

    第二个节点模块将帮助我们读取文件夹和写入文件。关于基本的fs node.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 绕过它吗?我不知道(如果您有想法,请发表评论)。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 您能否提供关于 tar-stream 说/显示它可以使用节点文件系统 ('fs') 流的位置的文档。我似乎找不到任何东西。
      • 在这一点上,我已经不再练习这个模块了。也许这会有所帮助? github.com/mafintosh/tar-stream/issues/8