“ 看文档一定要认真,不然你一定会后悔的!!!”
这是作者纠结君的一次踩坑经历。
事情的过程有点复杂,容在下从头说起。
缘起
话说N~久之前,纠结君的团队需要开发这样一个功能:
在 windows 操作系统的 nodejs 环境中解压一个 zip 文件,并在 nodejs 中实时获取解压进度。
对资源包的处理有如下需求:
将所有资源打包成一个文件
密码保护
原始资源的大小将近7G,包含的文件个数为19万,路径27万个,压缩过后的资源包大小超过了4G,所以使用7z作为解压工具。(7za是7z压缩和解压的核心,以下内容两个名词不做区别。)
这个功能是如此的 easy~ ,开发的小伙伴很快就开发完成,并进行提测了。
但是,测试小哥哥测试后说:前端进度卡在一个地方半个小时不动,这个程序肯定有 bug !
开发小伙伴弱弱地解释:这个么,你多等等就可以了。
果然,在测试小哥哥午觉醒来之后,解压成功。
但是,测试小哥哥依旧拒绝了上线请求,理由也很强大:你进度卡在那里,谁知道你后台是不是挂掉了?你还指望用户等你一个小时?
明明前端有进度条,为什么没有正常显示进度呢?
开发小伙伴说:后端拿不到7z解压进度,所以写了一个假的进度条。
对于这个理由,测试小哥哥表示理解,但对于上线依旧十动然拒。
入坑
一周前,纠结君开始接手这个功能,力求让前端看到一个正常的进度。
纠结君首先尝试直接运行7z命令。发现在命令行最下方可以显示一个进度条。然后使用nodejs中的child_process.exec方法调用7z,发现在子进程的stdout中,确实获取不到这个进度条。
在查阅了7z的文档后,纠结君发现7z使用-so参数可以将解压结果输出到stdout。纠结君尝试了一下,这个输出确实可以使用nodejs获取到。
这个很不错啊,7z可以获取解压后的文件大小,把输出到控制台上的数据大小做累加,取这个累加值跟之前获取的文件大小的比值,这不就是解压进度吗?
但是,你以为这样就大功告成了吗?No, no, no!
如果你这么认为,你真是too young to simple!
程序运行完成后,在硬盘上根本找不到解压后的文件。
因为解压结果都被输出到控制台上了,根本没有写入硬盘!&