前几天遇到一个需求,将一个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