• 用C#实现控制台进度条


    1.实现效果如下

    2.控制台进度条实现类  

    复制代码
      1 /***********************************************************************
      2 * 文 件 名:ProgressBar.cs
      3 * CopyRight(C) 2016-2020 中国XX工程技术有限公司
      4 * 文件编号:201603230001
      5 * 创 建 人:张华斌
      6 * 创建日期:2016-03-23
      7 * 修 改 人:
      8 * 修改日期:
      9 * 描    述:控制台进度条实现类
     10 ***********************************************************************/
     11 using System;
     12 
     13 namespace ProgressBarSolution
     14 {
     15     /// <summary>
     16     /// 进度条类型
     17     /// </summary>
     18     public enum ProgressBarType
     19     {
     20         /// <summary>
     21         /// 字符
     22         /// </summary>
     23         Character,
     24         /// <summary>
     25         /// 彩色
     26         /// </summary>
     27         Multicolor
     28     }
     29 
     30     public class ProgressBar
     31     {
     32 
     33         /// <summary>
     34         /// 光标的列位置。将从 0 开始从左到右对列进行编号。
     35         /// </summary>
     36         public int Left { get; set; }
     37         /// <summary>
     38         /// 光标的行位置。从上到下,从 0 开始为行编号。
     39         /// </summary>
     40         public int Top  { get; set; }
     41 
     42         /// <summary>
     43         /// 进度条宽度。
     44         /// </summary>
     45         public int Width { get; set; }
     46         /// <summary>
     47         /// 进度条当前值。
     48         /// </summary>
     49         public int Value { get; set; }
     50         /// <summary>
     51         /// 进度条类型
     52         /// </summary>
     53         public ProgressBarType ProgressBarType { get; set; }
     54 
     55     
     56         private ConsoleColor colorBack;
     57         private ConsoleColor colorFore;
     58 
     59 
     60         public ProgressBar():this(Console.CursorLeft, Console.CursorTop)
     61         {
     62 
     63         }
     64 
     65         public ProgressBar(int left, int top, int width = 50, ProgressBarType ProgressBarType = ProgressBarType.Multicolor)
     66         {
     67             this.Left = left;
     68             this.Top = top;
     69             this.Width = width;
     70             this.ProgressBarType = ProgressBarType;
     71                        
     72             // 清空显示区域;
     73             Console.SetCursorPosition(Left, Top);
     74             for (int i = left; ++i < Console.WindowWidth;) { Console.Write(" "); }
     75 
     76             if (this.ProgressBarType == ProgressBarType.Multicolor)
     77             {
     78                 // 绘制进度条背景; 
     79                 colorBack = Console.BackgroundColor;
     80                 Console.SetCursorPosition(Left, Top);
     81                 Console.BackgroundColor = ConsoleColor.DarkCyan;
     82                 for (int i = 0; ++i <= width;) { Console.Write(" "); }
     83                 Console.BackgroundColor = colorBack;
     84             }
     85             else
     86             {
     87                 // 绘制进度条背景;    
     88                 Console.SetCursorPosition(left, top);
     89                 Console.Write("[");               
     90                 Console.SetCursorPosition(left + width-1, top);
     91                 Console.Write("]");
     92             }
     93         }
     94 
     95         public int Dispaly(int value)
     96         {
     97            return  Dispaly(value, null);
     98         }
     99 
    100         public int Dispaly(int value, string msg )
    101         {
    102             if (this.Value != value)
    103             {
    104                 this.Value = value;
    105 
    106                 if (this.ProgressBarType == ProgressBarType.Multicolor)
    107                 {
    108                     // 保存背景色与前景色;
    109                     colorBack = Console.BackgroundColor;
    110                     colorFore = Console.ForegroundColor;
    111                     // 绘制进度条进度                
    112                     Console.BackgroundColor = ConsoleColor.Yellow;
    113                     Console.SetCursorPosition(this.Left, this.Top);
    114                     Console.Write(new string(' ', (int)Math.Round(this.Value / (100.0 / this.Width))));
    115                     Console.BackgroundColor = colorBack;
    116 
    117                     // 更新进度百分比,原理同上.                 
    118                     Console.ForegroundColor = ConsoleColor.Green;
    119                     Console.SetCursorPosition(this.Left + this.Width + 1, this.Top);
    120                     if (string.IsNullOrWhiteSpace(msg)) { Console.Write("{0}%", this.Value); } else { Console.Write(msg); }
    121                     Console.ForegroundColor = colorFore;
    122                 }
    123                 else
    124                 {
    125                     // 绘制进度条进度      
    126                     Console.SetCursorPosition(this.Left+1, this.Top);
    127                     Console.Write(new string('*', (int)Math.Round(this.Value / (100.0 / (this.Width - 2)))));
    128                     // 显示百分比   
    129                     Console.SetCursorPosition(this.Left + this.Width + 1, this.Top);
    130                     if (string.IsNullOrWhiteSpace(msg)) { Console.Write("{0}%", this.Value); } else { Console.Write(msg); }
    131                 }
    132             }
    133             return value;
    134         }
    135     }
    136 }
    复制代码

    3.GZip文件操作类

    复制代码
     1 /***********************************************************************
     2 * 文 件 名:GZipHelper.cs
     3 * CopyRight(C) 2016-2020 中国XX工程技术有限公司
     4 * 文件编号:201603230002
     5 * 创 建 人:张华斌
     6 * 创建日期:2016-03-23
     7 * 修 改 人:
     8 * 修改日期:
     9 * 描    述:GZip文件操作类
    10 ***********************************************************************/
    11 using System;
    12 using System.IO;
    13 using System.IO.Compression;
    14 
    15 namespace ProgressBarSolution
    16 {
    17     /// <summary>
    18     /// GZip文件操作类;
    19     /// </summary>
    20     public class GZipHelper
    21     {
    22         /// <summary>
    23         /// 压缩文件;
    24         /// </summary>
    25         /// <param name="inputFileName">输入文件</param>
    26         /// <param name="dispalyProgress">进度条显示函数</param>
    27         public static void Compress(string inputFileName, Func<int, int> dispalyProgress = null)
    28         {
    29             using (FileStream inputFileStream = File.Open(inputFileName, FileMode.Open))
    30             {
    31                 using (FileStream outputFileStream = new FileStream(Path.Combine(Path.GetDirectoryName(inputFileName), string.Format("{0}.7z", Path.GetFileNameWithoutExtension(inputFileName))), FileMode.Create, FileAccess.Write))
    32                 {
    33                     using (GZipStream gzipStream = new GZipStream(outputFileStream, CompressionMode.Compress))
    34                     {
    35                         byte[] buffer = new byte[1024];
    36                         int count = 0;
    37                         while ((count = inputFileStream.Read(buffer, 0, buffer.Length)) > 0)
    38                         {
    39                             gzipStream.Write(buffer, 0, count);
    40                             if (dispalyProgress != null) { dispalyProgress(Convert.ToInt32((inputFileStream.Position / (inputFileStream.Length * 1.0)) * 100)); }
    41                         }
    42                     }
    43                 }
    44             }
    45         }
    46 
    47         /// <summary>
    48         /// 解压文件
    49         /// </summary>
    50         /// <param name="inputFileName">输入文件</param>
    51         /// <param name="outFileName">输出文件</param>
    52         /// <param name="dispalyProgress">进度条显示函数</param>
    53         public static void Decompress(string inputFileName, string outFileName, Func<int, int> dispalyProgress = null)
    54         {
    55             using (FileStream inputFileStream = File.Open(inputFileName, FileMode.Open))
    56             {
    57                 using (FileStream outputFileStream = new FileStream(outFileName, FileMode.Create, FileAccess.Write))
    58                 {
    59                     using (GZipStream decompressionStream = new GZipStream(inputFileStream, CompressionMode.Decompress))
    60                     {
    61                         byte[] buffer = new byte[1024];
    62                         int count = 0;
    63                         while ((count = decompressionStream.Read(buffer, 0, buffer.Length)) > 0)
    64                         {
    65                             outputFileStream.Write(buffer, 0, count);                           
    66                             if (dispalyProgress != null) { dispalyProgress(Convert.ToInt32((inputFileStream.Position / (inputFileStream.Length * 1.0)) * 100)); }
    67                         }
    68                     }
    69                 }
    70             }
    71         }
    72     }
    73 }
    复制代码

    4.控制台进度条测试程序

    复制代码
     1 /***********************************************************************
     2 * 文 件 名:Program.cs
     3 * CopyRight(C) 2016-2020 中国XX工程技术有限公司
     4 * 文件编号:201603230003
     5 * 创 建 人:张华斌
     6 * 创建日期:2016-03-23
     7 * 修 改 人:
     8 * 修改日期:
     9 * 描    述:控制台进度条测试
    10 ***********************************************************************/
    11 using System;
    12 
    13 namespace ProgressBarSolution
    14 {
    15     class Program
    16     {
    17         static void Main(string[] args)
    18         {
    19             try
    20             {
    21                 Console.WriteLine();
    22                 Console.WriteLine("正在压缩文件...");
    23                 ProgressBar progressBar = new ProgressBar(Console.CursorLeft, Console.CursorTop, 50, ProgressBarType.Character);
    24                 GZipHelper.Compress(@"D:Tempook.pdf", ProgressBar.Dispaly);
    25                 Console.WriteLine();
    26 
    27                 Console.WriteLine();
    28                 Console.WriteLine("正在解压文件...");
    29                 progressBar = new ProgressBar(Console.CursorLeft, Console.CursorTop, 50, ProgressBarType.Multicolor);
    30                 GZipHelper.Decompress(@"D:Tempook.7z", @"D:Tempook.pdf", ProgressBar.Dispaly);
    31                 Console.WriteLine();
    32                
    33             }
    34             catch (System.ArgumentOutOfRangeException ex)
    35             {
    36                 Console.Beep();
    37                 Console.WriteLine("进度条宽度超出可显示区域!");
    38             }
    39             finally
    40             {
    41                 Console.WriteLine();
    42                 Console.WriteLine("操作完成,按任意键退出!");
    43                 Console.ReadKey(true);
    44             }
    45         }
    46     }
    47 }
    复制代码

    5.下载地址

    http://pan.baidu.com/s/1pKvzFjt

  • 相关阅读:
    Windows中一个22年的漏洞
    关于口令强度等级的设计
    360招聘网络安全攻防技术研究员
    法国出售给阿联酋的卫星可能含有后门组件
    2013年极客范最受欢迎的10篇博文
    利用WPS 2012/2013 0day针对中国政府部门的定向攻击
    Kingsoft Office Writer 2012 8.1.0.3385
    破解Google Gmail的https新思路
    设计自己的密码规则,实现强壮的自我保护
    电信级的RSA加密后的密码的破解方法
  • 原文地址:https://www.cnblogs.com/yachao1120/p/10268039.html
Copyright © 2020-2023  润新知