重定向输出时,为什么调整控制台缓冲区会引发无效的句柄异常?

dSerk

将输出重定向到文件时,在C#控制台应用程序中调整Console.BufferWidth会引发异常。让我们称之为示例test1.exe:

static void Main(string[] args) {
    Console.BufferWidth = 240;
    Console.WriteLine("output1\noutput2");
}

标准输出很好:

test1.exe
output1
output2

重定向到文件会引发异常:

test1.exe > file.txt

Unhandled Exception: System.IO.IOException: The handle is invalid.

   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.__Error.WinIOError()
   at System.Console.SetBufferSize(Int32 width, Int32 height)
   at System.Console.set_BufferWidth(Int32 value)
   at test1.Program.Main(String[] args) in \\wopr\falken\test1\Program.cs:line 13

使用try ... catch可以忽略它,这很容易,但是对于文件句柄或一般而言,我还是有些不了解。

为什么手柄无效?

Bojan Komazec

重定向到文件

test1.exe > file.txt

意味着操作系统正在将您的应用程序的输出流从标准输出流(控制台)重定向到文件,并且这会在进程启动时发生。

控制台和文件都称为“ I / O设备”,操作系统为它们分配一个唯一的ID号,称为“ handle ”。系统使用此句柄来跟踪设备的属性。

不同的设备具有不同的属性。控制台由其窗口直观地表示,但数据(字符)存储在其缓冲区中。窗口具有其宽度和高度(请参见Console.WindowWidthConsole.WindowHeight属性),还有屏幕缓冲区的大小-宽度和高度(请参见Console.BufferWidthConsole.BufferHeight属性)。您可以打开,如果手动编辑这些属性命令提示符并转到属性中,如果你在标题栏的左上角点击图标出现的下拉菜单。

当您的应用程序执行时

Console.BufferWidth = 240;

它尝试更改当前输出设备(文件)不存在的属性(窗口缓冲区大小)。您的应用程序已重定向输出,它具有文件的句柄,并且Console.BufferWidth该对象不支持该句柄因此,您得到了IOException(句柄无效)。

有关Console如何在重定向的情况下设计代码的MSDN页面

如果将基础流重定向到文件,则在将基础流定向到控制台时正常工作的控制台类成员可能会引发异常。如果您重定向标准流,则对您的应用程序进行编程以捕获System.IO.IOException异常。您还可以使用IsOutputRedirected,IsInputRedirected和IsErrorRedirected属性来确定是否在执行引发System.IO.IOException异常的操作之前重定向标准流。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Windows 10 C ++中通过控制台屏幕缓冲区重定向子进程标准输出

在使用CreateFile(“ CONOUT $” ...)将控制台重定向回活动屏幕缓冲区后,为什么没有文本颜色?

读取控制台缓冲区/输出C ++

为什么我不能将PRINT的输出重定向到控制台?

重定向控制台 I/O:SetHandleInformation 因句柄无效而失败

为什么我的Interop代码会引发“堆栈cookie工具代码检测到基于堆栈的缓冲区溢出”异常?

当缓冲区未满时,为什么字节缓冲区会给出缓冲区溢出异常

为什么控制台会覆盖输出?

控制台:超过缓冲区时,背景颜色填充行

在将视频渲染到帧缓冲区时隐藏虚拟控制台的最佳实践

spyder Ipython控制台缓冲区

为什么从Git Bash运行.net核心控制台应用程序时,ReadKey会引发异常?

为什么 MySQL 在打印到控制台/重定向到文件时会有不同的输出

在批处理文件中使用netcat,为什么即使重定向输出也会保留在控制台中?

为什么从Nginx重定向输出无效?

将标准输出重定向回控制台

Windows 批量将输出重定向到控制台

在单个控制台行上处理输出重定向

使用Java实时重定向控制台输出流

无法将控制台输出重定向到文件

将systemd脚本输出重定向到控制台

将Python的控制台输出重定向到Dash

将Python输出重定向到控制台窗口

将控制台输出重定向到JavaFX TextArea?

写入控制台而不写入重定向的输出

重定向控制台应用程序的标准输出

Python:尝试写入文件时出现“ ValueError:无法打开控制台输入缓冲区进行写入”

为什么位缓冲区和缓冲区给我不同的输出?

为什么Java本机缓冲区会变慢?