C#清除控制台最后一项并替换新的?控制台动画

Posted

技术标签:

【中文标题】C#清除控制台最后一项并替换新的?控制台动画【英文标题】:C# clear Console last Item and replace new? Console Animation 【发布时间】:2011-02-17 09:49:47 【问题描述】:

以下 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 等等)所有下一个目录名称将替换上一个目录

【问题讨论】:

问题和[1]一样,有一些方法可以解决。 [1]:***.com/questions/888533/… 【参考方案1】:

使用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);

【讨论】:

如果我设置开始位置(作为当前打印行的开始),那么我需要清除。但它会清除所有屏幕 您的代码对此代码运行良好。但是在我的实际代码中,我触发了一个事件 foreach 目录名称,并将当前目录名称传递给事件处理程序,并且该事件处理程序打印当前项目。我在 eventHandler 中使用 consolewriteline。我尝试了相同的代码,但它不起作用 @GAPS:可能你只需要在事件处理程序中调用ClearCurrentConsoleLineWrite(不是WriteLine),但我不能确定,因为我不知道你的代码.无论如何,我认为您可以轻松地调整代码以满足您的需求,您只需要弄清楚它是如何工作的,我保证,这真的很简单。 @digEmAii thanx,这很有帮助,但我需要根据我的代码自定义它 我认为使用Console.Write(new string(' ', Console.WindowWidth - 1)) 可能比循环快一点【参考方案2】:

如果您的问题是清除控制台,则使用方法Console.Clear();,如果不是,则使用此方法覆盖最后一行;

Console.WriteLine("Searching file in...");
        foreach(var dir in DirList)
         
           Console.SetCursorPosition(1,0);
           Console.WriteLine(dir);
         

【讨论】:

我不想清除所有控制台。只打印最后一行【参考方案3】:

你可以用“\r”打印,这样光标就不会跳行了,你可以重写它。

foreach(var dir in DirList)
     
       Console.Write("\r0%           ",dir);
     

在数字后使用空格以确保所有内容都被擦除,并使用 .Write 而不是 WriteLine 因为你不想添加“\n”

【讨论】:

如果初始的 WriteLine 环绕,则会失败。【参考方案4】:

只需通过保存Console.CursorLeftConsole.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

【讨论】:

嗯.. 看起来很迷人。让我试试【参考方案5】:

虽然这是一篇很老的帖子,但我会发布我的方法。也许这会对某人有所帮助

Console.SetCursorPosition(0, Console.CursorTop);
Console.Write(new String(' ', Console.WindowWidth));
Console.SetCursorPosition(0, Console.CursorTop);
Console.Write(dir);

【讨论】:

【参考方案6】:

我想这就是你想要的;)

Console.WriteLine("Searching file in...");
    foreach(var dir in DirList)
     
       Console.Write(\"r" + dir);
     

【讨论】:

【参考方案7】:

这将满足我认为您的要求:

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

与@digEmAll 建议的基本相同,但它使用实际的字符数而不是 Console.WindowWidth

【讨论】:

以上是关于C#清除控制台最后一项并替换新的?控制台动画的主要内容,如果未能解决你的问题,请参考以下文章

动画的Java多行文本删除[关闭]

清除控制台时 C++ 闪烁

如何将 iPhone UIPickerView 从最后一项滚动到第一项并永远继续?

控制台 cout 动画 - C++

创建自定义视图控制器动画

热通过 sed 命令替换标准输出最后一个控制字符的最后一行?