С# очистить последний элемент консоли и заменить новым? Консольная анимация

Следующий код 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 и т. д.) Все следующие имена каталогов заменят предыдущий каталог


person PawanS    schedule 17.02.2011    source источник
comment
Проблема такая же, как [1], есть несколько способов ее решения. [1]: stackoverflow.com/questions/888533/   -  person lisunde    schedule 04.07.2012


Ответы (7)


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

Console.WriteLine("Searching file in...");
        foreach(var dir in DirList)
         {
           Console.SetCursorPosition(1,0);
           Console.WriteLine(dir);
         }
person The GiG    schedule 17.02.2011
comment
Я не хочу очищать всю консоль. Только последняя печатная строка - person PawanS; 17.02.2011

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

Что-то типа:

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

ИЗМЕНИТЬ:

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

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);
}
person digEmAll    schedule 17.02.2011
comment
Если я устанавливаю начальную позицию (как начало текущей печатной строки), мне нужно очистить. Но это очистит весь экран - person PawanS; 17.02.2011
comment
Ваш код отлично работает для этого кода. Но в моем фактическом коде я запускаю событие для каждого имени каталога, которое передает текущее имя каталога обработчику событий, и этот обработчик событий печатает текущий элемент. Я использую consolewriteline в обработчике событий. Я пробовал тот же код, но он не работает - person PawanS; 17.02.2011
comment
@GAPS: Возможно, вам просто нужно вызвать ClearCurrentConsoleLine и Write (не WriteLine) в обработчике событий, но я не могу быть уверен, потому что не знаю точно ваш код. В любом случае, я думаю, что вы можете легко настроить код под свои нужды, вам просто нужно понять, как он работает, и, уверяю, это очень просто. - person digEmAll; 17.02.2011
comment
@digEmAii, спасибо, это полезно, но мне нужно настроить его в соответствии с моим кодом. - person PawanS; 17.02.2011
comment
Я думаю, что использование Console.Write(new string(' ', Console.WindowWidth - 1)) может быть немного быстрее, чем цикл - person Ray; 08.02.2012
comment
@Ray: да, наверное, даже если я сомневаюсь, что ты заметишь разницу :) - person digEmAll; 10.02.2012

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

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

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

person David Pires    schedule 17.02.2011
comment
Это не удается, если исходная строка WriteLine обернута вокруг. - person mafu; 06.10.2016

Просто отслеживайте текущую позицию курсора, сохраняя значения свойств 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
person Jeff Mercado    schedule 17.02.2011
comment
хм.. выглядит очаровательно. Позвольте мне попробовать - person PawanS; 17.02.2011

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

Console.SetCursorPosition(0, Console.CursorTop);
Console.Write(new String(' ', Console.WindowWidth));
Console.SetCursorPosition(0, Console.CursorTop);
Console.Write(dir);
person Alpay    schedule 21.02.2013

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

Console.WriteLine("Searching file in...");
    foreach(var dir in DirList)
     {
       Console.Write(\"r" + dir);
     }
person user3770256    schedule 24.06.2014

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

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

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

person dlchambers    schedule 24.09.2011