0

0

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

P粉602998670

P粉602998670

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

|

889人浏览过

|

来源于php中文网

原创

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

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

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

直接读取 ZipFilefilelist 并手动遍历每个 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-zipunzip-stream 怎么加进度条?

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

Getsound
Getsound

基于当前天气条件生成个性化音景音乐

下载
  • unzip-streamentry 事件中,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 文件无法提前获取明文大小,ZipInputStreamzipfile 都会在解密时才抛异常,进度条可能突然中断
  • 多线程解压(如用 concurrent.futuresPromise.all)会让「已处理字节数」失去顺序性,必须加锁或改用原子计数器,否则进度跳变甚至倒退

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

1679

2023.10.19

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

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

506

2025.10.17

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

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

2318

2025.12.29

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

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

41

2026.01.19

length函数用法
length函数用法

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

952

2023.09.19

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

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

721

2023.08.10

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

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

371

2025.12.24

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

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

27

2026.01.21

html5播放器怎么用
html5播放器怎么用

本合集全面介绍HTML5播放器的使用方法,涵盖基础语法、自定义控制、兼容性处理及实战示例。阅读专题下面的文章了解更多详细内容。

0

2026.02.27

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 5.6万人学习

麻省理工大佬Python课程
麻省理工大佬Python课程

共34课时 | 5.4万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号