使用zlib压缩多个文件

24

以下代码将压缩一个文件。如何压缩多个文件?

var gzip = zlib.createGzip();
var fs = require('fs');
var inp = fs.createReadStream('input.txt');
var out = fs.createWriteStream('input.txt.gz');

inp.pipe(gzip).pipe(out);

如果你想压缩整个目录结构,尝试获取目录和文件的名称并使用递归函数。你可以使用其他模块,但这是原理。 - Gntem
4个回答

10
Gzip是一种压缩数据字符串的算法,它不知道文件或文件夹,因此无法单独完成您想要的操作。您可以使用归档工具构建一个单独的归档文件,然后使用gzip来压缩组成归档的数据: 另外请参阅这个答案以获取更多信息:Node.js - Zip/Unzip a folder

8

这方面最好的包(也是唯一一个仍然维护和文档齐备的)似乎是 archiver

var fs = require('fs');
var archiver = require('archiver');
var output = fs.createWriteStream('./example.tar.gz');
var archive = archiver('tar', {
    gzip: true,
    zlib: { level: 9 } // Sets the compression level.
});

archive.on('error', function(err) {
  throw err;
});

// pipe archive data to the output file
archive.pipe(output);

// append files
archive.file('/path/to/file0.txt', {name: 'file0-or-change-this-whatever.txt'});
archive.file('/path/to/README.md', {name: 'foobar.md'});

// Wait for streams to complete
archive.finalize();

这个完美地完成了工作,而且非常简单。 - robnordon

2
module.exports = class ZlibModule{

listOfImages = ['a.png','b.jpg'];
fs = require('fs')
zlib = require('zlib');

constructor(req,res){
    this.req = req;
    this.res = res;
}

compressOperation(){
    this.listOfImages.forEach((value,index) => {
        const readStream = this.fs.createReadStream(rootDirectory+'/modules/zlibModule/images/'+value);
        const writeStream = this.fs.createWriteStream(rootDirectory+'/modules/zlibModule/'+value+'.gz');
        const compress = this.zlib.createGzip()
        readStream
            .on('error',(error)=>{
                this.res.end(`${error.path} path does't exist`)
            })
            .pipe(compress)
            .pipe(writeStream)
            .on('error',(error)=>{
                console.log(error);
                this.res.end(`Something went to wrong`)
            })
            .on('finish',()=>{
                if(index+1 === this.listOfImages.length) this.res.end("Done");
            })
    });
}
}

-2

以下是您可以使用的内容:

var listOfFiles = ['firstFile.txt', 'secondFile.txt', 'thirdFile.txt'];

function compressFile(filename, callback) {
    var compress = zlib.createGzip(),
        input = fs.createReadStream(filename),
        output = fs.createWriteStream(filename + '.gz');

    input.pipe(compress).pipe(output);

    if (callback) {
        output.on('end', callback);
    }
}

#1 方法:

// Dummy, just compress the files, no control at all;
listOfFiles.forEach(compressFile);

#2 方法:

// Compress the files in waterfall and run a function in the end if it exists
function getNext(callback) {
    if (listOfFiles.length) {
        compressFile(listOfFiles.shift(), function () {
            getNext(callback);
        });
    } else if (callback) {
        callback();
    }
}

getNext(function () {
    console.log('File compression ended');
});

4
我希望您能提供一个包含所有文件的单个压缩文件。 - user3180402
这个zip文件具有比简单连接文件更具体的文件格式http://en.wikipedia.org/wiki/Zip_%28file_format%29,让我为您npm一下吧?https://www.npmjs.org/package/zip-paths - micnic
21
我有点困惑为什么这个答案被接受了,因为它似乎没有回答问题(正如user3180402在上面的评论中所说的那样)。 - B T
他只是添加了一个循环,没有任何连接。 - tiltdown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接