马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
场景:当我处理惩罚electron分析压缩包实现进度条的过程中发现终极的文件字节数有缺失,且有些字节为0,利用tar库研究未果!
办理方案:引入别的库办理tar-fs/tar-stream/zlib- // 如果你也需要在electron中使用可以参考:https://blog.csdn.net/jyl919221lc/article/details/142764766?spm=1001.2014.3001.5501
- try {
- // 第一步:读取 tar.gz 文件,获取第一个目录名称
- const extractor = tarStream.extract();
- let extractedFolderName = null;
- extractor.on('entry', (header, stream, next) => {
- if (!extractedFolderName && header.type === 'directory') {
- extractedFolderName = header.name.split('/')[0];
- }
- stream.resume(); // 跳过具体内容
- next();
- });
- extractor.on('error', (err) => {
- console.error('Error reading tar file to get folder name:', err);
- resolve({ code: 0, msg: '导入失败:无法读取文件获取文件夹名称' });
- });
- extractor.on('finish', () => {
- if (!extractedFolderName) {
- resolve({ code: 0, msg: '导入失败:无法确定解压后的文件夹名称' });
- return;
- }
- // 第二步:解压 tar.gz 文件到指定目录
- const extract = tarFS.extract(diagnosisDir);
- const readStream = fs.createReadStream(tarFilePath);
- const gunzip = zlib.createGunzip(); // 创建 gunzip 解压缩流
- let processedSize = 0;
- const totalSize = fs.statSync(tarFilePath).size;
- readStream.on('data', (chunk) => {
- processedSize += chunk.length;
- const progress = parseFloat((processedSize / totalSize).toFixed(2));
- // mainWindow.setProgressBar(progress); 展示出electron进度条
- });
- readStream.on('error', (err) => {
- console.error('Error reading the archive:', err);
- resolve({ code: 0, msg: '导入失败:读取文件失败' });
- });
- extract.on('error', (err) => {
- console.error('Error extracting the archive:', err);
- resolve({ code: 0, msg: '导入失败:解压文件失败' });
- });
- extract.on('finish', () => {
- console.log('Extraction completed');
- // mainWindow.setProgressBar(-1); // 重置进度条
- const fullPath = path.join(diagnosisDir, extractedFolderName);
- console.log(fullPath, 'fullPath');
- resolve({ code: 1, msg: '导入成功', path: fullPath });
- });
- // 管道:读取文件 -> 解压缩 -> 提取 tar 文件
- readStream.pipe(gunzip).pipe(extract);
- });
- // 读取 tar.gz 文件以获取第一个目录名称
- const readStreamForFolderName = fs.createReadStream(tarFilePath);
- const gunzipForFolderName = zlib.createGunzip(); // 创建 gunzip 解压缩流
- readStreamForFolderName.pipe(gunzipForFolderName).pipe(extractor);
- } catch (error) {
- console.error('Error during extraction:', error);
- resolve({ code: 0, msg: '导入失败' });
- }
复制代码 |