使用C#获取没有最后一行的控制台缓冲区?

时间:2015-06-19 22:34:47

标签: c#

我想要实现的是一个没有有毒输出的自编译c#文件。我正在尝试使用Console.MoveBufferArea方法实现此目的但看起来不起作用。 例如。 - 使用.bat扩展程序保存下面的代码:

// 2>nul||@goto :batch
/*
:batch
@echo off
setlocal

:: find csc.exe
set "frm=%SystemRoot%\Microsoft.NET\Framework\"
for /f "tokens=* delims=" %%v in ('dir /b /a:d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do (
   set netver=%%v
   goto :break_loop
)
:break_loop
set csc=%frm%%netver%\csc.exe
:: csc.exe found
%csc% /nologo /out:"%~n0.exe" "%~dpsfnx0" 
%~n0.exe
endlocal
exit /b 0
*/
public class Hello
{
   public static void Main() {
      ClearC();
      System.Console.WriteLine("Hello, C# World!");
   }

   private static void ClearC() {
        System.Console.MoveBufferArea(
            0,0,
            System.Console.BufferWidth,System.Console.BufferHeight-1,
            0,0
        );
   }
}

输出将是:

C:\>//  2>nul  ||
Hello, C# World!

想要摆脱// 2>nul ||。有可能吗?我的逻辑(ClearC方法)有什么问题吗?我需要PInvoke吗?

1 个答案:

答案 0 :(得分:2)

如果您想在C#中执行此操作,那么将ClearC功能更改为以下内容似乎有效:

public static void ClearC() {
    System.Console.CursorTop = System.Console.CursorTop - 1;
    System.Console.Write(new string(' ', System.Console.BufferWidth));
    System.Console.CursorTop = System.Console.CursorTop - 1;
}

基本上,将光标向上移动一行(到应该包含提示的行),将整行移动,然后向上移动另一行(这将使您移动到命令之间的空白行)。未来的输出将从这里开始。

明显的缺点是,在删除// 2>nul ||之前,您需要等待编译和执行C#代码。如果您希望它更快,您需要找到基于控制台/批处理文件的解决方案。要记住的另一件事是假设提示是单行。如果这是一个非常长的提示,跨越两行,那么你会有点乱,所以最好清除两行,这取决于你计划如何使用它。

如果您想要整个程序并开始阅读控制台缓冲区以确定提示的时间长度,那么您可能需要查看此question。虽然答案中的文章链接已被破坏,但代码下载似乎仍然有效。

如果您想了解基于批处理文件的方法,那么您可能需要查看此question