NodeJS 文件(夹)压缩/解压方案(zip/unzip)-Linux上zip相关命令
adm-zip
支持archive
和unarchive
一个或多个文件或者整个文件夹的功能,使用非常的简单方便。
var adm_zip = require('adm-zip');
//creating archives
var zip = new adm_zip();
zip.addLocalFolder('./dist');
zip.writeZip('./dist.zip');
//extracting archives
var unzip = new adm_zip('dist.zip');
unzip.extractAllTo("./dist", /*overwrite*/true);
更多api https://github.com/cthackers/adm-zip
这个库在使用的时候需要把文件一个个增加到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
文件,而且它只是存在于内存中,需要写文件操作后才会真正存到磁盘。
更多API https://github.com/Stuk/jszip
archiver
很强大,支持zip
格式tar
格式,只需要提供路径就可以压缩已存在的文件夹。 压缩:
// require modules
var fs = require('fs');
var archiver = require('archiver');
// create a file to stream archive data to.
var output = fs.createWriteStream(__dirname + '/example.zip');
var archive = archiver('zip', {
zlib: { level: 9 } // Sets the compression level.
});
// pipe archive data to the file
archive.pipe(output);
// append a file from stream
var file1 = __dirname + '/file1.txt';
archive.append(fs.createReadStream(file1), { name: 'file1.txt' });
// append a file from string
archive.append('string cheese!', { name: 'file2.txt' });
// append a file from buffer
var buffer3 = Buffer.from('buff it!');
archive.append(buffer3, { name: 'file3.txt' });
// append a file
archive.file('file1.txt', { name: 'file4.txt' });
// append files from a sub-directory and naming it `new-subdir` within the archive
archive.directory('subdir/', 'new-subdir');
// append files from a sub-directory, putting its contents at the root of archive
archive.directory('subdir/', false);
// append files from a glob pattern
archive.glob('subdir/*.txt');
// finalize the archive (ie we are done appending files but streams have to finish yet)
// 'close', 'end' or 'finish' may be fired right after calling this method so register to them beforehand
archive.finalize();
解压
var fs = require("fs");
var unzip = require("unzip");
fs.createReadStream('archiver-unzip.zip').pipe(unzip.Extract({ path: 'unarchive' }));
更多API https://github.com/archiverjs/node-archiver
Linux
上zip/unzip
命令apt-get install zip unzip
解压缩zip文件
语 法:unzip [-cflptuvz][-agCjLMnoqsVX][-P <密码>][.zip文件][文件][-d <目录>][-x <文件>] 或 unzip [-Z]
补充说明:unzip
为.zip
压缩文件的解压缩程序。
参 数:
[.zip文件] 指定.zip压缩文件。
基本用法是:zip [参数] [打包后的文件名] [打包的目录路径]
参数:
范 例:
zip
命令可以用来将文件压缩成为常用的zip
格式。unzip
命令则用来解压缩zip
文件。
压缩文件abc.txt
和一个目录dir1
,名字 test.zip
:
zip -r test.zip abc.txt dir1
#解压缩:
```sh
unzip test.zip
目录下有abc1.zip,abc2.zip和abc3.zip,使用通配符
unzip abc\?.zip
注释:?表示一个字符,如果用*表示任意多个字符。
不解压,只查看内容
unzip -v test.zip
验证zip文件完成性,查看网上下的包包 是不是已经下载完了
unzip -t test.zip
我用-v选项发现music.zip压缩文件里面有很多目录和子目录,并且子目录中其实都是歌曲mp3文件,我想把这些文件都下载到第一级目录,而不是一层一层建目录:
unzip -j music.zip