Node.js应用中如何实现长尾关键词的文件解压缩功能示例?

2026-04-01 14:032阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1808个文字,预计阅读时间需要8分钟。

Node.js应用中如何实现长尾关键词的文件解压缩功能示例?

目录 + 引言 + 压缩 + 解压 + 压缩工具 + adm-zip + 压缩解压 + 总结 + 引言 + 今天在使用 Node.js 脚本处理文件时,需要实现一个功能,即将一个 zip 压缩包解压,修改其中的文件后,重新打包。

目录
  • 引言
  • compressing
    • 解压
    • 压缩
  • archiver
    • adm-zip
      • 压缩
      • 解压缩
    • 总结

      引言

      今天在使用 node 脚本对文件处理时,需要实现一个功能,要对一个 zip 压缩包解压出来,修改里面的文件后,重新打包成zip包。node 解压缩文件的场景在实际应用中还是比较常见,下面介绍几个用来解压缩文件的库和使用方法。

      compressing

      compressing 是一个使用起来方便、功能非常强大的node库,它可以对文件、文件夹进行解压或压缩,支持tar、gzip、tgz、zip等多种格式。

      简单安装之后 npm install compressing,以 zip 压缩包为例

      解压

      解压比较简单,tar、gzip、zip 都是同个 API

      const compressing = require('compressing'); // 将压缩包解压到 test 文件夹中 compressing.zip.uncompress('./test.zip','./test').then(() => { console.log('解压完成') }).catch(() => { console.log('解压失败') }) // 将压缩包解压到当前文件夹中 compressing.zip.uncompress('./test.zip','./')

      压缩

      const compressing = require('compressing'); // 压缩一个文件 compressing.zip.compressFile('E:/1.txt','E:/1.zip').then(() => { console.log('压缩完成') }).catch(() => { console.log('压缩失败') }) // 压缩一个文件夹 compressing.zip.compressDir('E:/test', 'E:/test.zip').then(func1).catch(func2); // 同时压缩多个文件和文件夹,采用 stream 的方式 const zipStream = new compressing.zip.Stream(); zipStream.addEntry('./test'); zipStream.addEntry('./1.txt'); zipStream.pipe(fs.createWriteStream('./test1.zip')).on('finish', ()=>{ console.log('压缩完成') }).on('error', ()=>{ console.log('压缩失败') })

      在使用compressing.zip.compressDir压缩整个文件夹的时候,会把最外层的文件夹也一起压缩,解压出来又是一个完整的文件夹。但是我的需求时只想把这个文件夹下的所有文件打包,直接解压出来得到零散的很多个文件。

      最初的想法呢是通过 fs的API对文件夹进行遍历,用 addEntry 的方式打包,后来发现原来是可以设置参数的,只是文档中没有表现出来,而且写着:usually you don't need it ,导致我走了很多弯路。

      后面在 addEntry 的接口文档中看到了有个 opt.ignoreBase 的参数,才想到 compressDir 是不是也可以用。于是尝试了一下,的确满足了我的需求,含泪删掉遍历文件夹的代码。

      compressing.zip.compressDir('E:/test', 'E:/test.zip', { ignoreBase: true })

      基本上,一个解压和压缩的需求就可以完成了。可偏偏就遇到了个问题,在用 compressing 压缩成一个zip包之后,在某个特殊的系统中,用系统自带的解压出来,文件都变成文件夹了,比如 app.js 是个js文件,解压后变成一个名为 app.js 的文件夹。这就很尴尬了。

      我尝试了compressDiraddEntry的方式,最终得到的结果都一样。于是乎,为了验证是这个系统本身解压算法的问题,我又找了另外一个压缩库。

      archiver

      archiver是一个在nodejs中能跨平台实现打包功能的模块,通过 stream 的方式,可以打zip和tar包。如果连这个打包之后在这个系统中解压出来的文件还是有问题的话,那我就可以认为是这个系统的问题,而不是我代码的问题。

      const output = fs.createWriteStream('./test.zip'); const archive = archiver('zip', {zlib: { level: 9 // 设置压缩等级 }}); archive.pipe(output); archive.directory('./test', false); // 这里false参数和上面的ignoreBase为true效果一样 archive.finalize(); // 完成压缩 archive.on('end', () => { // 压缩结束时触发 console.log('压缩完成'); });

      本来想证明是这个系统本身存在问题,结果却狠狠打脸了。用 archiver 压缩后的 zip 包在这个系统中解压出来是正常的文件,那么真相就是 compressing 的压缩算法有点问题,只不过这个问题复现的场景很不一般,在正常的系统中都不会遇到。

      不过呢,我想了又想,现在也只能算是一比一打平,为了科学的严谨性,我决定再找一个压缩库进行验证。

      Node.js应用中如何实现长尾关键词的文件解压缩功能示例?

      adm-zip

      adm-zip 是一个支持zip压缩和解压缩的库,而我也只需要压缩zip格式包,刚好可以满足我的需求。

      const admzip = new AdmZip(); // 压缩文件夹 admzip.addLocalFolder('./test'); // 压缩文件 admzip.addLocalFile('./1.txt'); admzip.writeZip('./test.zip');

      addLocalFolder 压缩整个文件夹的时候,会把这个文件夹下的所有文件打包,直接解压出来得到零散的很多个文件,效果和compressDir设置参数ignoreBase为true一样。

      addLocalFolder 支持第二个参数,可以将要压缩的文件,压缩进压缩包的某个路径下。

      admzip.addLocalFolder('./test','aaa'); admzip.addLocalFolder('./test','aaa/bbb');

      可以设置多级目录,解压出来后的文件就在这个目录里。

      writeZip 是一个同步的方法,而上面两个库压缩都是异步的。在使用 adm-zip 打包之后,验证出来的效果和 archiver 是一样的,在那个特殊的系统上,解压都没有问题。这就真的证明了 compressing 真的存在小问题,不过在正常场景中应该都可以忽略不计。

      解压缩

      adm-zip 也支持解压缩。

      const admzip = new AdmZip('./test.zip'); admzip.extractAllTo('./test'); // 把整个压缩包完全解压到 test 目录中

      除了解压整个压缩包,还支持单独解压某个文件

      const admzip = new AdmZip('./test.zip'); const entry = zip.getEntry('1.txt'); admzip.extractEntryTo(entry, './test2', true, true);

      extractEntryTo 支持4个参数,第三个参数表示是否需要创建父文件夹,第四个参数表示是否要覆盖。

      总结

      经过多个库的使用和对比,发现 adm-zip 可以完美的解决我的需求,同时打包之后,体积也是最小的。在大部分的开发场景中,用哪个库其实都不会有问题的。compressing 可以支持更多的压缩格式,adm-zip只支持zip格式,archiver 却不支持解压缩,因此根据自己的应用场景选择最合适的库吧。

      以上就是Node.js 应用探索文件解压缩示例详解的详细内容,更多关于Node.js 文件解压缩的资料请关注易盾网络其它相关文章!

      本文共计1808个文字,预计阅读时间需要8分钟。

      Node.js应用中如何实现长尾关键词的文件解压缩功能示例?

      目录 + 引言 + 压缩 + 解压 + 压缩工具 + adm-zip + 压缩解压 + 总结 + 引言 + 今天在使用 Node.js 脚本处理文件时,需要实现一个功能,即将一个 zip 压缩包解压,修改其中的文件后,重新打包。

      目录
      • 引言
      • compressing
        • 解压
        • 压缩
      • archiver
        • adm-zip
          • 压缩
          • 解压缩
        • 总结

          引言

          今天在使用 node 脚本对文件处理时,需要实现一个功能,要对一个 zip 压缩包解压出来,修改里面的文件后,重新打包成zip包。node 解压缩文件的场景在实际应用中还是比较常见,下面介绍几个用来解压缩文件的库和使用方法。

          compressing

          compressing 是一个使用起来方便、功能非常强大的node库,它可以对文件、文件夹进行解压或压缩,支持tar、gzip、tgz、zip等多种格式。

          简单安装之后 npm install compressing,以 zip 压缩包为例

          解压

          解压比较简单,tar、gzip、zip 都是同个 API

          const compressing = require('compressing'); // 将压缩包解压到 test 文件夹中 compressing.zip.uncompress('./test.zip','./test').then(() => { console.log('解压完成') }).catch(() => { console.log('解压失败') }) // 将压缩包解压到当前文件夹中 compressing.zip.uncompress('./test.zip','./')

          压缩

          const compressing = require('compressing'); // 压缩一个文件 compressing.zip.compressFile('E:/1.txt','E:/1.zip').then(() => { console.log('压缩完成') }).catch(() => { console.log('压缩失败') }) // 压缩一个文件夹 compressing.zip.compressDir('E:/test', 'E:/test.zip').then(func1).catch(func2); // 同时压缩多个文件和文件夹,采用 stream 的方式 const zipStream = new compressing.zip.Stream(); zipStream.addEntry('./test'); zipStream.addEntry('./1.txt'); zipStream.pipe(fs.createWriteStream('./test1.zip')).on('finish', ()=>{ console.log('压缩完成') }).on('error', ()=>{ console.log('压缩失败') })

          在使用compressing.zip.compressDir压缩整个文件夹的时候,会把最外层的文件夹也一起压缩,解压出来又是一个完整的文件夹。但是我的需求时只想把这个文件夹下的所有文件打包,直接解压出来得到零散的很多个文件。

          最初的想法呢是通过 fs的API对文件夹进行遍历,用 addEntry 的方式打包,后来发现原来是可以设置参数的,只是文档中没有表现出来,而且写着:usually you don't need it ,导致我走了很多弯路。

          后面在 addEntry 的接口文档中看到了有个 opt.ignoreBase 的参数,才想到 compressDir 是不是也可以用。于是尝试了一下,的确满足了我的需求,含泪删掉遍历文件夹的代码。

          compressing.zip.compressDir('E:/test', 'E:/test.zip', { ignoreBase: true })

          基本上,一个解压和压缩的需求就可以完成了。可偏偏就遇到了个问题,在用 compressing 压缩成一个zip包之后,在某个特殊的系统中,用系统自带的解压出来,文件都变成文件夹了,比如 app.js 是个js文件,解压后变成一个名为 app.js 的文件夹。这就很尴尬了。

          我尝试了compressDiraddEntry的方式,最终得到的结果都一样。于是乎,为了验证是这个系统本身解压算法的问题,我又找了另外一个压缩库。

          archiver

          archiver是一个在nodejs中能跨平台实现打包功能的模块,通过 stream 的方式,可以打zip和tar包。如果连这个打包之后在这个系统中解压出来的文件还是有问题的话,那我就可以认为是这个系统的问题,而不是我代码的问题。

          const output = fs.createWriteStream('./test.zip'); const archive = archiver('zip', {zlib: { level: 9 // 设置压缩等级 }}); archive.pipe(output); archive.directory('./test', false); // 这里false参数和上面的ignoreBase为true效果一样 archive.finalize(); // 完成压缩 archive.on('end', () => { // 压缩结束时触发 console.log('压缩完成'); });

          本来想证明是这个系统本身存在问题,结果却狠狠打脸了。用 archiver 压缩后的 zip 包在这个系统中解压出来是正常的文件,那么真相就是 compressing 的压缩算法有点问题,只不过这个问题复现的场景很不一般,在正常的系统中都不会遇到。

          不过呢,我想了又想,现在也只能算是一比一打平,为了科学的严谨性,我决定再找一个压缩库进行验证。

          Node.js应用中如何实现长尾关键词的文件解压缩功能示例?

          adm-zip

          adm-zip 是一个支持zip压缩和解压缩的库,而我也只需要压缩zip格式包,刚好可以满足我的需求。

          const admzip = new AdmZip(); // 压缩文件夹 admzip.addLocalFolder('./test'); // 压缩文件 admzip.addLocalFile('./1.txt'); admzip.writeZip('./test.zip');

          addLocalFolder 压缩整个文件夹的时候,会把这个文件夹下的所有文件打包,直接解压出来得到零散的很多个文件,效果和compressDir设置参数ignoreBase为true一样。

          addLocalFolder 支持第二个参数,可以将要压缩的文件,压缩进压缩包的某个路径下。

          admzip.addLocalFolder('./test','aaa'); admzip.addLocalFolder('./test','aaa/bbb');

          可以设置多级目录,解压出来后的文件就在这个目录里。

          writeZip 是一个同步的方法,而上面两个库压缩都是异步的。在使用 adm-zip 打包之后,验证出来的效果和 archiver 是一样的,在那个特殊的系统上,解压都没有问题。这就真的证明了 compressing 真的存在小问题,不过在正常场景中应该都可以忽略不计。

          解压缩

          adm-zip 也支持解压缩。

          const admzip = new AdmZip('./test.zip'); admzip.extractAllTo('./test'); // 把整个压缩包完全解压到 test 目录中

          除了解压整个压缩包,还支持单独解压某个文件

          const admzip = new AdmZip('./test.zip'); const entry = zip.getEntry('1.txt'); admzip.extractEntryTo(entry, './test2', true, true);

          extractEntryTo 支持4个参数,第三个参数表示是否需要创建父文件夹,第四个参数表示是否要覆盖。

          总结

          经过多个库的使用和对比,发现 adm-zip 可以完美的解决我的需求,同时打包之后,体积也是最小的。在大部分的开发场景中,用哪个库其实都不会有问题的。compressing 可以支持更多的压缩格式,adm-zip只支持zip格式,archiver 却不支持解压缩,因此根据自己的应用场景选择最合适的库吧。

          以上就是Node.js 应用探索文件解压缩示例详解的详细内容,更多关于Node.js 文件解压缩的资料请关注易盾网络其它相关文章!