Node.js - 压缩/解压缩文件夹

hta*_*irt 19 zlib node.js

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

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

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

谢谢.

hta*_*irt 25

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

如评论中所述,我们需要分两步压缩文件夹:

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

  2. 压缩.tar文件

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

npm install tar
npm install fstream
Run Code Online (Sandbox Code Playgroud)

第一个允许我们创建.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 */
Run Code Online (Sandbox Code Playgroud)

这有助于我使用node.js压缩整个文件夹

还有2件事:

  • 如您所见,tar模块上缺少文档.我希望这会很快得到改进,因为提供的两个示例讨论了如何从.tar文件中提取内容.

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


And*_*dry 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'));
Run Code Online (Sandbox Code Playgroud)

无需显式使用zlib.