控制台应用程序中的进度条出现问题

本文关键字:问题 应用程序 控制台 | 更新日期: 2023-09-27 18:25:25

我正在C#控制台应用程序中显示进度条。它正在用一个小错误做它应该做的事情。

这是进度条形码:

private static void ProgressBar(int progress, int total)
    {
        //draw empty progress bar
        Console.CursorLeft = 0;
        Console.Write("["); //start
        Console.CursorLeft = 32;
        Console.Write("]"); //end
        Console.CursorLeft = 1;
        float onechunk = 30.0f / total;
        //draw filled part
        int position = 1;
        for (int i = 0; i < onechunk * progress; i++)
        {
            Console.BackgroundColor = ConsoleColor.Green;
            Console.CursorLeft = position++;
            Console.Write(" ");
        }
        //draw unfilled part
        for (int i = position; i <= 31; i++)
        {
            Console.BackgroundColor = ConsoleColor.Black;
            Console.CursorLeft = position++;
            Console.Write(" ");
        }
        //draw totals
        Console.CursorLeft = 35;
        Console.BackgroundColor = ConsoleColor.Black;
        Console.Write(progress.ToString() + " of " + total.ToString() + "    "); 
    }

如果它总共处理了5个文件,它将显示:

第4页,共5页

即使它正确地处理了所有5个文件。

例如,我将XML文件从目录加载到字符串数组中。

string[] xmlFilePath = Directory.GetFiles(xmlFullpath, "*.xml");

然后我有一个for loop,在它里面我调用我的进度条函数。

for (int i = 0; i < xmlFilePath.Length; i++)
{
  ProgressBar(i, xmlFilePath.Length);
}

这就是我的工作方式。我知道,由于它从位置0开始,它将打印0 1 2 3 4(共5个)。但我想从第1页开始打印,第2页开始打印。。。第5页,共5页。

所以我把for循环改为从1号位置开始。

for (int i = 1; i< xmlFilePath.Length; i++)
{
}

在这种情况下,它只处理4个文件,所以我将xmlFilePath.Length更改为xmlFilePath.Length +1,但我得到了index out bound异常。

关于如何解决这个问题,有什么建议吗?

控制台应用程序中的进度条出现问题

数组索引是基于0的,因此必须从0开始。您可以从索引0开始,但在将数据传递到进度条时添加1。

for (int i = 0; i < xmlFilePath.Length; i++)
{
    ProgressBar(i + 1, xmlFilePath.Length);
}

只要对你的进度条撒谎

for (int i = 0; i < xmlFilePath.Length; i++)
{
   ProgressBar(i + 1, xmlFilePath.Length);
}

只是另一个小问题
我认为你需要改变停止绘制绿色方块到的条件

int position = 1;
for (int i = 0; i <= onechunk * progress; i++)
{
    Console.BackgroundColor = ConsoleColor.Green;
    Console.CursorLeft = position++;
    Console.Write(" ");
}

否则,最后一个字符位置保持为黑色。