在终端实现下载进度条
方案
<?php
// 参考https://mengkang.net/1412.html
$width = exec("tput cols");
$progress = "[]100%";
$del = strlen($progress);
$width = $width - $del;
$progress = "[%-{$width}s]%d%%\r";
for($i=1;$i<=$width;$i++){
printf($progress,str_repeat("=",$i),($i/$width)*100);
usleep(30000);
}
echo "\n";
解释说明
-
tput cols
获取终端的“宽度”,实际是字符列数; -
%s
我们知道是字符串的占位符; -
%-{n}s
的意思是占位n
个字符,不足的用空格补充,这样在输出进度条的时候,最末尾的值的位置就是固定的; -
%%
输出百分号; - 最重要的一点,格式的末尾使用了
\r
则将光标移动到行首,则下次再输出时则把上次的整行覆盖,给人进度条动态变化的效果。
C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <unistd.h>
int main()
{
struct winsize size;
ioctl(STDIN_FILENO, TIOCGWINSZ, &size);
int width = size.ws_col;
const char *progress = "[]100%";
width = width - strlen(progress);
char width_str[10] = {0};
sprintf(width_str,"%d",width);
char progress_format[20] = {0};
strcat(progress_format,"[%-");
strcat(progress_format,width_str);
strcat(progress_format,"s]%d%%\r");
// printf("%s\n",progress_format);
// [%-92s]%d%%\r
char progress_bar[width+1];
memset(progress_bar,0,width+1);
for(int i=1;i<=width;i++){
strcat(progress_bar,"=");
printf(progress_format,progress_bar,(i*100/width));
// 或者使用
// fprintf(stdout,progress_format,progress_bar,(i*100/width));
fflush(stdout); // 必须刷新缓存区,否则会显得很卡顿
usleep(10000);
}
printf("\n");
return 0;
}

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
2020 年 DevOps 的七大发展趋势
一项权威研究表明:2017 年,DevOps 在市场上创造了 29 亿美元;预计到 2022 年,这个数字将达到 66 亿美元。作为软件项目开发的关键性要素,DevOps 已经深入地影响到了软件世界的整体开发格局。许多专家预测 DevOps 将逐渐成为软件工程的主流模式,并将在 2020 年达到其顶峰。 因此,对于许多研发企业而言,开发人员已不再停留在是否对其感兴趣的层面上了,而是应该撸起袖子,真刀真枪地去实践 DevOps 相关的技术与方法。Hackernoon在引述 Statista 的文章中提到:从 2017 年到 2018 年间,DevOps 的全球使用率增长了 7%。而 IDC 预计 DevOps 的软件市场体量将从 2017 年的 29 亿美元,增长到 2022 年的 66 亿美元 (请参见https://www.idc.com/getdoc.jsp?containerId=US43722718)。 DevOps 具有以下优点: 能够对各种修改需求做出快速的反应。 能够实现灵活的安全部署与编排。 能够建立完善的协作与沟通渠道。 能够快速地识别出代码中的错误或漏洞。 开发团队...
-
下一篇
http client 实现 keep-alive 源码探究
前几天在分享"实现自己的wget"的时候,因为我们的请求是一次性的,http 头里设置的Connection: Close。在HTTP/1.1为了提升HTTP 1.0的网络性能,增加了keepalive的特性。那么浏览器在请求的时候都会加上Connection: Keep-Alive的头信息,是如何实现的呢?我们知道在服务端(nginx)可以通过设置keepalive_timeout来控制连接保持时间,那么http连接的保持需要浏览器(客户端)支持吗?今天咱们一起来通过java.net.HttpURLConnection源码看看客户端是如何维护这些http连接的。 测试代码 package net.mengkang.demo; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; public class Demo { public static void main(String[] args) throws IOException { test(); test(); } private st...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合Redis,开启缓存,提高访问速度
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2配置默认Tomcat设置,开启更多高级功能