1. 程式人生 > >node壓縮文件夾

node壓縮文件夾

ini 名單 試驗 ack package lte 遍歷文件 命名 地址

前幾天遇到一個需求,將一個10G的文件夾打包壓縮,並去除黑名單上的文件。

node自帶的只能壓縮文件。網上看了集中方案要麽對大文件操作不行,要麽只能直接操作文件夾,無法對文件夾遍歷篩選。

後來確定使用先遍歷文件夾打包,然後再壓縮的方案。然後在找打包模塊時發現tar打包時可以直接壓縮。試驗後確定使用這種方案。本機試驗,12G的文件夾,耗時大約18分鐘。

代碼如下,其中的tar時第三方模塊,需要另外安裝 npm install tar

 1 var fs = require(‘fs‘)
 2 var path = require(‘path‘)
 3 var util = require(‘util‘)
4 var tar = require(‘tar‘) 5 var zlib = require(‘zlib‘) 6 7 var now = Date.now() 8 9 var pack = new tar.Pack({gzip:true}) 10 11 var root = path.join(‘F:\\test‘) 12 console.log(root) 13 14 //遍歷文件夾,並以指定基準輸出 15 readDirSync(root,"base") 16 function readDirSync(path,base) { 17 if(base == undefined) {
18 base = path 19 } 20 var pa = fs.readdirSync(path) 21 pa.forEach((ele,index)=>{ 22 var info = fs.statSync(path + "/" + ele) 23 24 if(info.isDirectory()) { 25 //console.log("dir:" + ele) 26 readDirSync(path + "/" + ele,base +"/" + ele)
27 } else { 28 // console.log("file:" + base +"/" + ele) 29 pack.add(path + "/" + ele) 30 } 31 }) 32 33 } 34 35 pack.end() 36 var writeStream = fs.createWriteStream(‘test.tar.gz‘) 37 38 writeStream.on(‘finish‘,()=>{ 39 console.log(Date.now() - now) 40 }) 41 //pack.write(‘test.tar‘) 42 pack.pipe(writeStream)

代碼的邏輯很簡單,就是遍歷文件夾,添加到pack流中。第9行,設置使用gzip壓縮。得到文件名後 就可以對文件做過濾了。也可以使用tar的api,設置filter過濾,根據自己喜好選擇。

壓縮文件的格式命名需要是 tar.gz 否則用解壓軟件打開時會產生奇怪的現象~~~

tar的項目地址 https://www.npmjs.com/package/tar

node壓縮文件夾