我正在深入了解node.js的Zlib。我能够使用提供的示例(http://nodejs.org/api/zlib.html#zlib_examples)压缩和解压缩文件,但我无法找到有关为文件夹执行相同操作的更多信息?
一种可能性(但我认为是修补)是使用node-zip
模块并逐个添加文件夹的所有文件。但是在解压缩时我会遇到问题(在这种情况下我会丢失文件夹)。
知道如何使用Node.js压缩(然后解压缩)整个文件夹(尊重子焊工层次结构)?
感谢。
答案 0 :(得分:25)
我终于在@generalhenry的帮助下得到了它(见问题评论)和
如评论中所述,我们需要分两步压缩文件夹:
将文件夹转换为.tar
文件
压缩.tar
文件
为了执行第一步,我需要两个node.js模块:
npm install tar
npm install fstream
第一个允许我们创建.tar
个文件。您可以在https://github.com/isaacs/node-tar
第二个节点模块将帮助我们读取文件夹并编写文件。关于基本的fs
node.js模块,我不知道是否可以读取目录(我不是在谈论使用fs.readdir
获取数组中的所有文件,而是处理文件夹中的所有文件及其组织。)
然后,当我将文件夹转换为.tar
文件时,我可以使用Gzip()
的{{1}}对其进行压缩。
以下是最终代码:
Zlib
这有助于我使用node.js压缩整个文件夹
另外两件事:
正如您所看到的,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 */
模块上缺少文档。我希望这会很快得到改进,因为提供的两个示例讨论了如何从tar
文件中提取内容。
我使用.tar
模块来帮助我处理源目录。可以使用fstream
绕过这个吗?我不知道(如果您有任何想法,请发表评论)。
答案 1 :(得分:5)
自2013年以来,提供的答案package tar已更新。
要获得相同的结果,代码要简单得多:
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 :(得分:3)
您可以使用tar-stream模块创建tar存档。它比node-tar更灵活,更简单:
创建tar存档,然后使用zlib压缩它,然后将它写在任何你想要的地方(网络,文件系统等)。