コンソールアプリとしてツールを作ってると、処理の進捗とかをコンソールに出してあげたくなる。 普通にやると、メッセージだけでコンソールがどんどんスクロールしちゃうので感じ悪い。 同じ行でカウントアップの結果を表示したりしたいわけです。

で、これをやるためにはカーソルを行先頭に戻して書き直せればいいわけで、 ググるとだいたい↓の感じで出てくる。

Console.SetCursorPosition(0, Console.CursorTop);

これでカーソルが先頭に戻るでそのまま出力しなおせばいい。とゆーわけですが、 世の中そんな甘いもんじゃない。

ありがちな、|とか/をクルクル回すやつとか、「123/234」みたいな進捗出す奴は上のだけでいける。 ↓の感じ。

//カーソルのちらつきがイラつく場合はカーソル非表示に。。。
Console.CursorVisible = false;
for(int i=0;i<10000;i++)
{
        Console.Write("{0} / {1}", i, 10000);//進捗をカウンタで表現する場合
	Console.Write("|/―\".Substring(i%4,1));//クルクル回す場合
	Thread.Sleep(100);
	Console.SetCursorPosition(0, Console.CursorTop);
}

↑みたいに、文字数が固定か、増えていくだけの場合は問題ない。でも、例えば処理してるファイル名を表示している場合で「textdata01.txt」の後に「data01.txt」が来ると↓の感じになる。 test

そうじゃないんだ。

カーソル先頭に戻してるだけなので当たり前といえば当たり前か。これが嫌なので一行クリアしてくれる物がないか探してみたけど・・・無い。Clearはあるけど画面が全部クリアされる。コマンドでいう「cls」。しょうがないの今は↓の感じで対応中。

int prePos = Console.CursorLeft;//現在カーソル位置を取得
Console.SetCursorPosition(0, Console.CursorTop);
Console.Write(hogestr.PadRight(prePos));//前のカーソル位置まで空白埋めする

かっこ悪いけど、無い頭ではこれが限界だったとさ。