有一些解决方法的库,但我无法让它们正常工作。
我的想法就像是
untar(bufferStreamOrFilePath).extractToDirectory("/path", function(err){})
这样的东西可用吗?
答案 0 :(得分:13)
只是对此答案的更新,而不是node-tar
,请考虑使用tar-fs
,这会带来显着的性能提升,以及更整洁的界面。
var tarFile = 'my-other-tarball.tar';
var target = './my-other-directory';
// extracting a directory
fs.createReadStream(tarFile).pipe(tar.extract(target));
答案 1 :(得分:2)
tar-stream模块非常好:
var tar = require('tar-stream')
var extract = tar.extract();
extract.on('entry', function(header, stream, callback) {
// make directories or files depending on the header here...
// call callback() when you're done with this entry
});
fs.createReadStream("something.tar").pipe(extract)
extract.on('finish', function() {
console.log('done!')
});
答案 2 :(得分:0)
在内存中完全提取base64编码的tar的函数,假设tar中的所有文件都是utf-8编码的文本文件。
const tar=require('tar');
let Duplex = require('stream').Duplex;
function bufferToStream(buffer) {
let stream = new Duplex();
stream.push(buffer);
stream.push(null);
return stream;
}
module.exports=function(base64EncodedTar){
return new Promise(function(resolve, reject){
const buffer = new Buffer.from(base64EncodedTar, "base64");
let files={};
try{
bufferToStream(buffer).pipe(new tar.Parse())
.on('entry', entry => {
let file={
path:entry.path,
content:""
};
files[entry.path]=file;
entry.on('data', function (tarFileData) {
file.content += tarFileData.toString('utf-8');
});
// resolve(entry);
}).on('close', function(){
resolve(files);
});
} catch(e){
reject(e);
}
})
};