C # очистить консоль последнего элемента и заменить новым? Консольная анимация - PullRequest
15 голосов
/ 17 февраля 2011

Следующий код CSharp (только образец):

Console.WriteLine("Searching file in...");

foreach(var dir in DirList)
{
    Console.WriteLine(dir);
}

Печать выводится как:

Searching file in...

dir1

dir2

dir3

dir4

.

.

.

Вопрос? Как получить вывод как

Searching file in...

dir1  

(затем очистите dir1 и напечатайте dir2 и т. Д.) Все последующие имена dir заменят предыдущие dir

Ответы [ 7 ]

22 голосов
/ 17 февраля 2011

Используйте Console.SetCursorPosition, чтобы установить курсор на начало последней строки и переписать его.

Что-то вроде:

Console.WriteLine(dir);
Console.SetCursorPosition(0, Console.CursorTop - 1);

EDIT:

Согласно вашему комментарию, вы можете сделать следующее:

Console.WriteLine("Searching file in...");
foreach (var dir in DirList)
{
    ClearCurrentConsoleLine();
    Console.Write(dir);
}

С ClearCurrentConsoleLine определяется как:

public static void ClearCurrentConsoleLine()
{
    int currentLineCursor = Console.CursorTop;
    Console.SetCursorPosition(0, Console.CursorTop);
    for (int i = 0; i < Console.WindowWidth; i++)
        Console.Write(" ");
    Console.SetCursorPosition(0, currentLineCursor);
}
13 голосов
/ 17 февраля 2011

Если ваша проблема очищает консоль, тогда используйте метод Console.Clear();, если это не так, используйте его для перезаписи последней строки;

Console.WriteLine("Searching file in...");
        foreach(var dir in DirList)
         {
           Console.SetCursorPosition(1,0);
           Console.WriteLine(dir);
         }
10 голосов
/ 17 февраля 2011

Вы можете печатать, используя "\ r", таким образом курсор не пересекает строку, и вы можете переписать ее.

foreach(var dir in DirList)
     {
       Console.Write("\r{0}%           ",dir);
     }

используйте пробелы после числа, чтобы убедиться, что все стерто, и используйте .Writeвместо WriteLine, потому что вы не хотите добавлять "\ n"

6 голосов
/ 17 февраля 2011

Просто следите за текущей позицией курсора, сохраняя значения свойств Console.CursorLeft и Console.CursorTop.Затем напишите, перезагрузите и повторите.Вернее в этом случае сбросьте, запишите и повторите.

Console.WriteLine("Searching file in...");

// save the current cursor position
var cursorLeft = Console.CursorLeft;
var cursorTop = Console.CursorTop;

// build a format string to establish the maximum width do display
var maxWidth = 60;
var fmt = String.Format("{{0,-{0}}}", maxWidth);

foreach (var dir in dirList)
{
    // restore the cursor position
    Console.SetCursorPosition(cursorLeft, cursorTop);

    // trim the name if necessary
    var name = Path.GetFileName(dir);
    if (name.Length > maxWidth)
        name = name.Substring(0, maxWidth);

    // write the trimmed name
    Console.Write(fmt, name);

    // do some work
}
Console.WriteLine(); // end the previous line
3 голосов
/ 21 февраля 2013

Хотя это довольно старый пост, я опубликую свой подход. Может быть, это поможет кому-то

Console.SetCursorPosition(0, Console.CursorTop);
Console.Write(new String(' ', Console.WindowWidth));
Console.SetCursorPosition(0, Console.CursorTop);
Console.Write(dir);
2 голосов
/ 24 июня 2014

Я думаю, это то, что вы хотите;)

Console.WriteLine("Searching file in...");
    foreach(var dir in DirList)
     {
       Console.Write(\"r" + dir);
     }
1 голос
/ 24 сентября 2011

Это будет делать то, о чем я думаю , что вы просите:

string s = "\r";
s += new string(' ', Console.CursorLeft);
s += "\r";
Console.Write(s);

По сути то же самое, что и @digEmAll, предложенное, но вместо консоли используется фактическое число символов #.WindowWidth

...