1. ホーム
  2. c#

[解決済み] コンソールアプリケーションのプログレスバー

2023-04-07 17:11:58

質問

sftpサーバーにファイルをアップロードする簡単なc#コンソールアプリを書いています。しかし、ファイルの量が多くなっています。アップロードされたファイルの割合か、アップロードされるファイルの総数から既にアップロードされたファイルの数だけを表示したいと思います。

まず、全ファイルと総ファイル数を取得します。

string[] filePath = Directory.GetFiles(path, "*");
totalCount = filePath.Length;

そして、foreachループでファイルをループして1つずつアップロードしています。

foreach(string file in filePath)
{
    string FileName = Path.GetFileName(file);
    //copy the files
    oSftp.Put(LocalDirectory + "/" + FileName, _ftpDirectory + "/" + FileName);
    //Console.WriteLine("Uploading file..." + FileName);
    drawTextProgressBar(0, totalCount);
}

foreachループの中にプログレスバーがあるのですが、これが問題です。正しく表示されないのです。

private static void drawTextProgressBar(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.Gray;
        Console.CursorLeft = position++;
        Console.Write(" ");
    }

    //draw unfilled part
    for (int i = position; i <= 31 ; i++)
    {
        Console.BackgroundColor = ConsoleColor.Green;
        Console.CursorLeft = position++;
        Console.Write(" ");
    }

    //draw totals
    Console.CursorLeft = 35;
    Console.BackgroundColor = ConsoleColor.Black;
    Console.Write(progress.ToString() + " of " + total.ToString() + "    "); //blanks at the end remove any excess
}

出力は1943のうち[ ]0のみ

私はここで何を間違えているのでしょうか?

EDITです。

XMLファイルの読み込みと書き出し中にプログレスバーを表示させようとしています。しかし、それはループを通過しています。最初のラウンドを終了した後、2 番目のラウンドに行き、その繰り返しです。

string[] xmlFilePath = Directory.GetFiles(xmlFullpath, "*.xml");
Console.WriteLine("Loading XML files...");
foreach (string file in xmlFilePath)
{
     for (int i = 0; i < xmlFilePath.Length; i++)
     {
          //ExportXml(file, styleSheet);
          drawTextProgressBar(i, xmlCount);
          count++;
     }
 }

forループから抜け出せない...何かいい方法はないでしょうか?

どのように解決するのですか?

この行はあなたの問題です。

drawTextProgressBar(0, totalCount);

繰り返しごとに進捗が0になるということですが、これはインクリメントする必要があります。代わりにforループを使うといいかもしれません。

for (int i = 0; i < filePath.length; i++)
{
    string FileName = Path.GetFileName(filePath[i]);
    //copy the files
    oSftp.Put(LocalDirectory + "/" + FileName, _ftpDirectory + "/" + FileName);
    //Console.WriteLine("Uploading file..." + FileName);
    drawTextProgressBar(i, totalCount);
}