7z -- -- 提振器
从一个7z的档案中读取条目,其中包含一个Aync interator,承诺,调回,或可读流. 来源可以是归档路径或可读流.
安装
npm install 7z-iterator
提取归档
const SevenZipIterator = require('7z-iterator');
async function extract(archivePath, destination) {
const iterator = new SevenZipIterator(archivePath);
const links = [];
try {
for await (const entry of iterator) {
if (entry.type === 'link') links.unshift(entry);
else if (entry.type === 'symlink') links.push(entry);
else await entry.create(destination, { strip: 1 });
}
// Create links after their target directories and files.
for (const entry of links) await entry.create(destination, { strip: 1 });
} finally {
iterator.destroy();
}
}
extract('./archive.7z', './output').catch((error) => {
console.error(error);
process.exitCode = 1;
});
旧节点恢复API.js
节点.js 0.8+可以使用回调形式代替 for await数字 :
var SevenZipIterator = require('7z-iterator');
var iterator = new SevenZipIterator('./archive.7z');
var links = [];
function createLinks(index, callback) {
if (index === links.length) return callback();
links[index].create('./output', { strip: 1 }, function(error) {
if (error) return callback(error);
createLinks(index + 1, callback);
});
}
iterator.forEach(function(entry, callback) {
if (entry.type === 'link') { links.unshift(entry); callback(); }
else if (entry.type === 'symlink') { links.push(entry); callback(); }
else entry.create('./output', { strip: 1 }, callback);
}, { callbacks: true, concurrency: 1 }, function(error) {
if (error) throw error;
createLinks(0, function(error) {
iterator.destroy();
if (error) throw error;
console.log('Extraction complete');
});
});
entry.create(destination, options) 写入文件、目录或链接。 使用 { force: true } 以覆盖已存在的条目。 例如, 将归档密码传递给执行器构建器 new SevenZipIterator(archivePath, { password: 'secret' })。可读流源被缓冲到临时文件,因为7z解析需要随机访问.
限制
节点.js 0.8+得到支持,但更早的释放最大值较小 Buffer 尺寸。 LZMA1文件夹必须装入一个缓冲器;LZMA2可以递增流出并被选入大型档案. 在Node.js 0.8-4.x上,大于约1GB的档案无法可靠地处理.