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:可能你只需要在事件处理程序中调用ClearCurrentConsoleLine
和Write
(不是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.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
【讨论】:
嗯.. 看起来很迷人。让我试试【参考方案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#清除控制台最后一项并替换新的?控制台动画的主要内容,如果未能解决你的问题,请参考以下文章