作者: 倪舒扬
项目里要用到 archive 和 unarchive 整个已存在的 folder,在找解决方案的时候尝试了一些当前比较流行的 library,主要有 adm-zip, JSZip, archiver 等。
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 好。
这个库在使用的时候需要把文件一个个增加到 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 中添加一个 img 子目录,在下面创建 a.txt,效果等同于
- zip.folder("img").file('a.txt')
。这里还需要注意的是,文件的内容都需要手动添加,如果仅仅是 zip.file("a.txt"); 只是在 zip 对象中创建了内容为空的 txt 文件,而且它只是存在于内存中,需要写文件操作后才会真正存到磁盘。
- zip.file("img/a.txt")
Pros and cons:
1. 对于一些实时接受到的数据转成 zip 的比较适用。 2. 对于已存在的文件夹操作不便,需要一个个把内容添加到 zip 对象,再转成文件。
3. 很多编码需要注意。
4. 只有压缩功能。
这个组合是最后我使用的,比较靠谱,使用也比较简单,其中 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/gildas-lormeau/zip.js
https://github.com/imaya/zlib.js
- 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
来源: