2014-02-24 81 views
11

下面的代碼將壓縮一個文件。我怎麼能壓縮多個文件使用zlib壓縮多個文件

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); 
+0

如果要壓縮整個目錄結構,請嘗試使用遞歸函數獲取目錄和文件的名稱。你可以使用其他模塊,但這是理論。 – Gntem

+7

爲什麼downvote,這個問題是完全合理的(因爲node.js文檔根本沒有提及它) –

回答

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'); 
}); 
+0

我想要一個包含所有文件的zip文件。 – user3180402

+0

壓縮文件有一個更具體的文件格式,而不僅僅是連接文件http://en.wikipedia.org/wiki/Zip_%28file_format%29,讓我npm這個給你? https://www.npmjs.org/package/zip-paths – micnic

+6

我有點困惑爲什麼這個答案已被接受,因爲它似乎並沒有回答這個問題(根據上面的用戶3180402的評論^) –

3

Gzip已被一種壓縮一串數據的算法。它對文件或文件夾一無所知,所以不能單獨做你想做的事情。你可以做的是使用一個歸檔工具來建立一個單一的歸檔文件,然後使用gzip壓縮,構成了歸檔數據:

也看到這個答案詳細信息:Node.js - Zip/Unzip a folder

0

這種情況的最佳的解決方案(和仍然保持和適當的記錄只有一個)似乎是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();