讲师中心 微信公众号

工具推荐

视频效率加速
AniShort
AniShort

AI短剧协同制作平台

updream

一键生成高质量推广成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Seko
Seko

AI短剧一键生成成片

初级项目:如何实现一个简单的文件解压进度条_流监听器实战

秋萱同学_6264

秋萱同学_6264

发布时间:2026-02-27 11:24:12

|

949人浏览过

|

来源于php中文网

原创

唯一可靠方式是遍历filelist手动解压并累加file_size计算进度,因extractall无回调且compress_size不适用于ZIP_STORED项;Java需预扫描ZipFile getSize()求和;Node.js应选unzip-stream监听entry.data事件。

初级项目:如何实现一个简单的文件解压进度条_流监听器实战

Python 用 zipfile 解压时怎么拿到实时进度?

直接读取 ZipFile 的 filelist 并手动遍历每个 ZipInfo 对象,是唯一可靠的方式。因为 extractall() 是黑盒操作,不暴露流式回调接口。

  • 先调用 zf.filelist 获取所有文件元信息,按 file_size 累加算出总大小
  • 再用 zf.open(name) 逐个打开并写入,每写一块就更新已处理字节数
  • 别依赖 getinfo().compress_size 做进度分母——压缩包里可能有未压缩项(compression == ZIP_STORED),实际解压字节数远大于它
  • 示例关键逻辑:
    total = sum(f.file_size for f in zf.filelist)<br>for f in zf.filelist:<br>    with zf.open(f) as src, open(dst_path, "wb") as dst:<br>        while True:<br>            chunk = src.read(8192)<br>            if not chunk: break<br>            dst.write(chunk)<br>            processed += len(chunk)<br>            print(f"{processed/total*100:.1f}%")

Java 里 ZipInputStream 为什么无法精确反馈解压进度?

根本原因:它只提供「已读取的压缩流字节」,不包含原始未压缩尺寸,而解压过程是边解边写,无法预知最终输出量。

  • 常见错误是拿 ZipInputStream.available() 或已读压缩字节数除以整个 ZIP 文件长度——这完全不反映真实解压进度
  • 可行方案只有两种:① 先用 ZipFile(非流式)预扫描所有 ZipEntry.getSize() 求和;② 接受粗略估算(如按压缩包内文件数量计数,适合小文件多、大小均匀的场景)
  • 注意 getSize() 返回 -1 表示尺寸未知(常见于 zip64 或某些打包工具),此时必须 fallback 到文件数进度或放弃精确显示

Node.js 用 adm-zip 或 unzip-stream 怎么加进度条?

adm-zip 不支持流式监听,只能走“先解压到内存 Buffer 再写盘”的路子,天然不适合大文件;unzip-stream 才是正解,靠监听 entry 事件 + stream.length。

  • unzip-stream 的 entry 事件中,stream.length 是该文件原始大小(未压缩),可安全用于进度计算
  • 务必监听 stream.on("data", ...) 而不是 "end"——后者只在文件写完才触发,无法做实时更新
  • 容易漏掉的是:ZIP 中可能含目录项(stream.type === "Directory"),它的 length 是 0,需跳过,否则进度会卡住
  • 简单示意:
    const total = entries.reduce((s, e) => s + (e.stream.length || 0), 0);<br>extract.on("entry", entry => {<br>  let loaded = 0;<br>  entry.stream.on("data", chunk => {<br>    loaded += chunk.length;<br>    console.log(`${(loaded / entry.stream.length * 100).toFixed(1)}%`);<br>  });<br>});

进度条不准的三个隐蔽根源

不是代码写错,而是 ZIP 格式本身带来的约束,多数人第一次踩都以为是自己逻辑问题。

  • file_size 字段可能被故意设为 0 或 -1(尤其某些 Windows 打包工具),导致预计算总大小失败
  • 加密 ZIP 文件无法提前获取明文大小,ZipInputStream 和 zipfile 都会在解密时才抛异常,进度条可能突然中断
  • 多线程解压(如用 concurrent.futures 或 Promise.all)会让「已处理字节数」失去顺序性,必须加锁或改用原子计数器,否则进度跳变甚至倒退

真正难的从来不是画个进度条,而是搞清你手里的 ZIP 文件到底有没有给你留出算进度的依据。

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3248

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5449

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3909

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

506

2026.01.19

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

1987

2023.09.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4818

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

1349

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

443

2026.01.21

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn