OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

NodeJS 文件(夹)压缩/解压方案(zip/unzip)-Linux上zip相关命令


分享到
分类 JS学习   关键字 开源   发布 ourjs  1457173868304
注意 转载须保留原文链接,译文链接,作者译者等信息。  

作者: 倪舒扬


项目里要用到archive和unarchive整个已存在的folder,在找解决方案的时候尝试了一些当前比较流行的library,主要有adm-zip, JSZip, archiver等。


一.Use adm-zip

adm-zip支持archive和unarchive一个或多个文件或者整个文件夹的功能,使用非常的简单方便。

   var adm_zip = require('adm-zip');

   //creating archives
   var zip = new adm_zip();  
   zip.addLocalFolder('archiver');  
   zip.writeZip('adm/adm-archive.zip');  

   //extracting archives  
   var unzip = new adm_zip('adm/adm-archive.zip');  
   unzip.extractAllTo("adm/adm-unarchive/", /*overwrite*/true);


Pros and cons: 
1. 同时实现了压缩和解压,而且只要提供路径就可以对已存在的文件或文件夹进行操作,实现了很多接口,使用方便简单。 
2. 本身存在bug,有的时候解压文件没法还原到本来的文件。Hope慢慢这些bug会fix好。


二. Use JSZip

这个库在使用的时候需要把文件一个个增加到zip对象中,而且需要把内容也手动添加,再使用写文件操作把内存中的zip对象转成物理存储。所以如果是对于一整个文件夹来说,就很麻烦,需要遍历文件夹。

var JSZip = require("jszip");
var fs = require("fs");

var zip = new JSZip();

var file_content = fs.readFileSync('archive/a.txt');


zip.file("a.txt",file_content);

var data = fs.readFileSync("archive/img/pic.jpeg");
zip.file("img/pic.jpeg", data, {base64: true});

var zipfolder = zip.generate({type:"nodebuffer"});

fs.writeFile("jszip.zip", zipfolder, function(err) {
    if (err) throw err;
});

JSZip里面也有个folder方法,但它只是用来切换zip对象内部的虚拟路径,比如zip.folder("img").file('a.txt')就是在zip中添加一个img子目录,在下面创建a.txt,效果等同于zip.file("img/a.txt")。这里还需要注意的是,文件的内容都需要手动添加,如果仅仅是zip.file("a.txt");只是在zip对象中创建了内容为空的txt文件,而且它只是存在于内存中,需要写文件操作后才会真正存到磁盘。

Pros and cons: 
1.对于一些实时接受到的数据转成zip的比较适用。 2.对于已存在的文件夹操作不便,需要一个个把内容添加到zip对象,再转成文件。 
3.很多编码需要注意。 
4.只有压缩功能。


三. Use archiver and unzip

这个组合是最后我使用的,比较靠谱,使用也比较简单,其中archiver很强大,支持zip格式tar格式,只需要提供路径就可以压缩已存在的文件夹。 压缩:

var fs = require('fs');
var archiver = require('archiver');

var output = fs.createWriteStream('archiver-unzip.zip');
var archive = archiver('zip');

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

archive.pipe(output);
archive.bulk([
    { src: ['archiver/**']}
]);
archive.finalize();

解压:

var fs = require("fs");
var unzip = require("unzip");

fs.createReadStream('archiver-unzip.zip').pipe(unzip.Extract({ path: 'unarchive' }));

Pros and cons: 
1. 久经试用,bug较少。 
2.使用方便,不需要遍历文件夹。 
3. 均只提供压缩或者解压,没有两个功能都实现的。(所以adm-zip其实很好用,但bug是硬伤啊...)

这些只是我昨天找的一些库,欢迎推荐其他库么么哒


OurJS注* 其它使用JavaScript实现的zip/unzip 开源项目

https://github.com/Stuk/jszip

https://github.com/gildas-lormeau/zip.js

https://github.com/imaya/zlib.js



Linux上zip/unzip命令

安装
apt-get install zip unzip


解压缩zip文件

语  法:unzip [-cflptuvz][-agCjLMnoqsVX][-P <密码>][.zip文件][文件][-d <目录>][-x <文件>] 或 unzip [-Z]

补充说明:unzip为.zip压缩文件的解压缩程序。


参  数:

-c   将解压缩的结果显示到屏幕上,并对字符做适当的转换。  

-f   更新现有的文件。  

-l   显示压缩文件内所包含的文件。  

-p   与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换。  

-t   检查压缩文件是否正确。  

-u   与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中。  

-v   执行是时显示详细的信息。  

-z   仅显示压缩文件的备注文字。  

-a   对文本文件进行必要的字符转换。  

-b   不要对文本文件进行字符转换。   

-C   压缩文件中的文件名称区分大小写。  

-j   不处理压缩文件中原有的目录路径。  

-L   将压缩文件中的全部文件名改为小写。  

-M   将输出结果送到more程序处理。  

-n   解压缩时不要覆盖原有的文件。  

-o   不必先询问用户,unzip执行后覆盖原有文件。  

-P<密码>   使用zip的密码选项。  

-q   执行时不显示任何信息。  

-s   将文件名中的空白字符转换为底线字符。  

-V   保留VMS的文件版本信息。  

-X   解压缩时同时回存文件原来的UID/GID。  


[.zip文件]   指定.zip压缩文件。


[文件]   指定要处理.zip压缩文件中的哪些文件。


-d<目录>   指定文件解压缩后所要存储的目录。  

-x<文件>   指定不要处理.zip压缩文件中的哪些文件。

-Z   unzip -Z等于执行zipinfo指令。


基本用法是:zip [参数] [打包后的文件名] [打包的目录路径]

 

参数:

-a     将文件转成ASCII模式

-F     尝试修复损坏的压缩文件

-h     显示帮助界面

-m     将文件压缩之后,删除源文件

 

-n     特定字符串    不压缩具有特定字尾字符串的文件

-o     将压缩文件内的所有文件的最新变动时间设为压缩时候的时间

-q     安静模式,在压缩的时候不显示指令的执行过程

-r     将指定的目录下的所有子目录以及文件一起处理

-S     包含系统文件和隐含文件(S是大写)

 

 

范 例:

zip命令可以用来将文件压缩成为常用的zip格式。unzip命令则用来解压缩zip文件。

1. 我想把一个文件abc.txt和一个目录dir1压缩成为yasuo.zip:

# zip -r yasuo.zip abc.txt dir1

2.我下载了一个yasuo.zip文件,想解压缩:

# unzip yasuo.zip

3.我当前目录下有abc1.zip,abc2.zip和abc3.zip,我想一起解压缩它们:

# unzip abc\?.zip

注释:?表示一个字符,如果用*表示任意多个字符。

4.我有一个很大的压缩文件large.zip,我不想解压缩,只想看看它里面有什么:

# unzip -v large.zip

5.我下载了一个压缩文件large.zip,想验证一下这个压缩文件是否下载完全了

# unzip -t large.zip

6.我用-v选项发现music.zip压缩文件里面有很多目录和子目录,并且子目录中其实都是歌曲mp3文件,我想把这些文件都下载到第一级目录,而不是一层一层建目录:

# unzip -j music.zip



原文地址: 点此
社区评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. NodeJS将有望使用微软的ChakraCore JavaScript引擎驱动
  2. 用HTML5原生实现拖放或排序
  3. ASP.NET 开发人员不必担心 Node 的五大理由
  4. Express入门教程:一个简单的博客
  5. 改变手机浏览器(iPhone/Android)上文本输入框的默认弹出键盘(数字)
  6. 使用Node.js操作跨平台数据库Firebird
  7. Array及String的lastIndexOf函数用法及其IE8实现,及为什么要尽量避免使用for in
  8. 如何用CSS将select/option文本居中或居右对齐
  9. IBM宣布向Node.js基金会捐赠Express Framework
  10. 美国程序员低价雇中国人替其编程被解雇
  11. AirJD-简单好用的免费建站工具

 相关阅读 - JS学习
  1. iPad/iPhone默认input按钮的disabled CSS样式不工作
  2. Array及String的lastIndexOf函数用法及其IE8实现,及为什么要尽量避免使用for in
  3. Express入门教程:一个简单的博客
  4. 用HTML5原生实现拖放或排序
  5. 如何用CSS将select/option文本居中或居右对齐
  6. 改变手机浏览器(iPhone/Android)上文本输入框的默认弹出键盘(数字)
  7. 掌握Node.js的文件系统[File System 基础]
  8. JavaScript也有getter/setter方法:ES5 Object对象的5个不为人知的特性
  9. ES6中的Map与JSON的相互转化(序列和持久化)
  10. 用jQuery和JavaScript深度复制JSON对象的方法

 关键字 - 开源
  1. Mongoose学习参考文档——基础篇
  2. Github Pages疑似被封: 再也不能用Pages搭建个人博客了
  3. 15个最好用的Node.JS后端框架
  4. 使用NodeJS搭建邮件自动发送服务器
  5. wemall app商城源码android开发MD5加密工具类
  6. 【数据可视化】基础知识贴:10大关键术语
  7. wemall app商城源码中基于PHP的ThinkPHP惯例配置文件代码
  8. Node.JS超越jQuery成为Github上第二受欢迎的开源项目
  9. wemall软件交易平台微信图文编辑器部分代码分享
  10. wemall开源商城免费商城系统部分代码(内含代码地址)

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号