控制台进度条

京沙 京沙     2022-08-14     675

关键词:

  今天在整理资料的时候,翻出多年前在网上看到的一篇帖子,一个控制台的进度条,非常酷炫,原文出处-传送门

     记得在刚开始接触编程的时候,用控制台写些小工具玩,也喜欢将信息打印到屏幕上,看着不断闪动的屏幕觉得很酷,后来一次偶然的机会看到了这个进度条让控制台的输出又上了一个层次,感谢作者。

 static void Main(string[] args)
        {
            Random r = new Random();
            while (true)
            {
                ConsoleProgressBar bar = new ConsoleProgressBar("测试ConsoleApplication ProgressBar");
                int c = r.Next(534);
                for (int i = 1; i <= c; i++)
                {
                    bar.Update(i, c, string.Format("完成进度:{0}/{1}", i, c));

                    System.Threading.Thread.Sleep(10);
                }
                Console.WriteLine("Contiue?(y/n)");
                string s=Console.ReadLine();
                if (s.Equals("n",StringComparison.InvariantCultureIgnoreCase))
                    break;
            }
        }

 

 public class ConsoleProgressBar
    {
        int left = 0;
        int backgroundLength = 50;
        #region [ window api ]
        ConsoleColor colorBack = Console.BackgroundColor;
        ConsoleColor colorFore = Console.ForegroundColor;
        private const int STD_OUTPUT_HANDLE = -11;
        private int mHConsoleHandle;
        COORD barCoord;
        [StructLayout(LayoutKind.Sequential)]
        public struct COORD
        {
            public short X;
            public short Y;
            public COORD(short x, short y)
            {
                X = x;
                Y = y;
            }
        }
        [StructLayout(LayoutKind.Sequential)]
        struct SMALL_RECT
        {
            public short Left;
            public short Top;
            public short Right;
            public short Bottom;
        }
        [StructLayout(LayoutKind.Sequential)]
        struct CONSOLE_SCREEN_BUFFER_INFO
        {
            public COORD dwSize;
            public COORD dwCursorPosition;
            public int wAttributes;
            public SMALL_RECT srWindow;
            public COORD dwMaximumWindowSize;
        }

        [DllImport("kernel32.dll", EntryPoint = "GetStdHandle", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        private static extern int GetStdHandle(int nStdHandle);

        [DllImport("kernel32.dll", EntryPoint = "GetConsoleScreenBufferInfo", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        private static extern int GetConsoleScreenBufferInfo(int hConsoleOutput, out CONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo);

        [DllImport("kernel32.dll", EntryPoint = "SetConsoleCursorPosition", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        private static extern int SetConsoleCursorPosition(int hConsoleOutput, COORD dwCursorPosition);

        public void SetCursorPos(short x, short y)
        {
            SetConsoleCursorPosition(mHConsoleHandle, new COORD(x, y));
        }

        public COORD GetCursorPos()
        {
            CONSOLE_SCREEN_BUFFER_INFO res;
            GetConsoleScreenBufferInfo(mHConsoleHandle, out res);
            return res.dwCursorPosition;
        }
        #endregion

        public ConsoleProgressBar(string title, int left = 10)
        {
            Console.WriteLine();
            //获取当前窗体句柄
            mHConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
            //获取当前窗体偏移量
            barCoord = this.GetCursorPos();
            this.left = left;
            //获取字符长度
            int len = GetStringLength(title);
            //设置标题的相对居中位置
            Console.SetCursorPosition(left + (backgroundLength / 2 - len), barCoord.Y);
            Console.Write(title);
            //写入进度条背景
            Console.BackgroundColor = ConsoleColor.DarkCyan;
            Console.SetCursorPosition(left, barCoord.Y + 1);
            for (int i = 0; ++i <= backgroundLength; )
                Console.Write(" ");
            Console.WriteLine();
            Console.BackgroundColor = colorBack;
        }
        /// <summary>
        /// 更新进度条
        /// </summary>
        /// <param name="current">当前进度</param>
        /// <param name="total">总进度</param>
        /// <param name="message">说明文字</param>
        public void Update(int current, int total, string message)
        {
            //计算百分比
            int i = (int)Math.Ceiling(current / (double)total * 100);

            Console.BackgroundColor = ConsoleColor.Yellow;
            Console.SetCursorPosition(left, barCoord.Y + 1);

            //写入进度条
            StringBuilder bar = new StringBuilder();
            //当前百分比*进度条总长度=要输出的进度最小单位数量
            int count = (int)Math.Ceiling((double)i / 100 * backgroundLength);
            for (int n = 0; n < count; n++) bar.Append(" ");
            Console.Write(bar);
            //设置和写入百分比
            Console.BackgroundColor = colorBack;
            Console.ForegroundColor = ConsoleColor.Green;
            Console.SetCursorPosition(left + backgroundLength, barCoord.Y + 1);
            Console.Write(" {0}% ", i);
            Console.ForegroundColor = colorFore;
            //获取字符长度
            int len = GetStringLength(message);
            //获取相对居中的message偏移量
            Console.SetCursorPosition(left + (backgroundLength / 2 - len), barCoord.Y + 2);
            Console.Write(message);
            //进度完成另起新行作为输出
            if (i >= 100) Console.WriteLine();
        }

        /// <summary>
        /// 获取字符长度
        /// </summary>
        /// <remarks>中文和全角占长度1,英文和半角字符2个字母占长度1</remarks>
        /// <param name="message"></param>
        /// <returns></returns>
        private int GetStringLength(string message)
        {
            int len = Encoding.ASCII.GetBytes(message).Count(b => b == 63);
            return (message.Length - len) / 2 + len;
        }
    }

 

      

控制进度条的粗细

】控制进度条的粗细【英文标题】:ControlThicknessofProgressBar【发布时间】:2015-03-1708:37:17【问题描述】:我有一个进度条,如下所示:我的问题很简单,我将如何控制圆形视图的“厚度”,因为在我看来它似乎太厚了。非常感谢... 查看详情

Laravel 4.2 Artisan 控制台进度条

】Laravel4.2Artisan控制台进度条【英文标题】:Laravel4.2ArtisanConsoleProgressBar【发布时间】:2016-09-2414:58:24【问题描述】:我想问一下是否有人设法在artisan控制台中显示了symfony进度条。我使用的是Windows7和Laravel4.2框架。到目前为止,... 查看详情

c#控制台console进度条(代码片段)

1说明笔者大多数的开发在Linux下,多处用到进度条的场景,但又无需用到图形化界面,所以就想着弄个console下的进度条显示。2步骤清行显示//清行处理操作intcurrentLineCursor=Console.CursorTop;//记录当前光标位置Console.SetCursorPosition(0,Co... 查看详情

python实用工具用python在控制台输出进度条(代码片段)

 进度条在一些计时任务中会经常使用,这里提供两种在控制台输出进度条显示的简单源代码:#进度条1importtimeforiinrange(1,101):print('\\r'+'▋'*i+'当前进度:%'.format(i),end='')time.sleep(0. 查看详情

vc6.0里mfc进度条如何使用

参考技术A演练CProgress7.1进度条的主要功能进度条控制(ProgressControl)主要用来进行数据读写、文件拷贝和磁盘格式等操作时的工作进度提示情况,如安装程序等,伴随工作进度的进展,进度条的矩形区域从左到右利用当前活动... 查看详情

java控制台示例中的java进度条(代码片段)

查看详情

视频控制的简易进度条

视频控制的简易进度条样式:作用:控制视频的播放点,实时显示视频播放位置 html:<divclass="coll"><spanname="progress"><b></b><b></b><b></b></span></div>css:.coll{position:abs 查看详情

js控制进度条到达100%跳转界面一

进度条一般在手机上用到的比较广泛,刚好最近的项目也是一直在做手机站,这个特效是手机端的一个界面,现在我把改成pc端了,进度条的快慢速度和样式可自行调节,改动也是很方便的,不多说,看代码:<!DOCTYPEhtml><h... 查看详情

doozyui⭐️十五progressor:进度条控制器

文章目录 查看详情

学习进度条

 第四周所花时间(小时)8代码量(行)400博客量(篇)2所学到的知识学习《软件需求模式》的第五、六章,学习编写C#控制台程序,对基本的输入输出还有变量、数组的定义有了一定的了解,学习安装Oracle数据库。  查看详情

复制文件时在控制台中显示进度条。在 python 中使用 tqdm

】复制文件时在控制台中显示进度条。在python中使用tqdm【英文标题】:displayprogressbarinconsolewhilecopyingfiles.usingtqdminpython【发布时间】:2020-10-0203:47:49【问题描述】:我有一个python脚本,它从源文件夹读取并使用shutil包将现有文件... 查看详情

python文本进度条(代码片段)

文本进度条:编程通过格式化字符串输出和时间延迟实现控制台风格文本进度条绘制效果如上图importtimescale=10print("执行开始".center(scale,'-'))foriinrange(scale+1):a='*'*ib="."*(scale-i)c=(i/sc 查看详情

react开发(251):react项目理解antdesignsteps控制进度条

  查看详情

react开发(251):react项目理解antdesignsteps控制进度条

  查看详情

主视图控制器外的多线程进度条并发问题

】主视图控制器外的多线程进度条并发问题【英文标题】:Multi-threadedprogressbarconcurrencyissueoutsidethemainviewcontroller【发布时间】:2015-10-2910:02:20【问题描述】:我在同一个线程和视图控制器中找到了很多进度条更新解决方案,但它... 查看详情

使用进度条在python中复制文件

...美运行,现在我想在复制时显示进度条。我使用tqdm包在控制台中显示进度条,效果很好,但问题是它在每个文件上显示进度条并每次遍历所有现有文件.示例:如果一个文件夹包含128个文件,它将像这样显 查看详情

Bootstrap 进度条不会在 Angular HTTP 事件进度中自动更新

...件显示我的发布请求的进度。事件进度完美运行(我正在控制台中查看它),但除非我单击页面,否则更改不会显示在进度栏中。这是我使用HT 查看详情

如何隐藏 Android sdkmanager 下载进度条?

...uot;这样的sdkmanager命令时,由于下载进度条,它会在Jenkins控制台中吐出数百行。有没有办法隐藏它或将其置于安静模式 查看详情