将输出重定向到文件时,在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可以忽略它,这很容易,但是对于文件句柄或一般而言,我还是有些不了解。
为什么手柄无效?
重定向到文件
test1.exe > file.txt
意味着操作系统正在将您的应用程序的输出流从标准输出流(控制台)重定向到文件,并且这会在进程启动时发生。
控制台和文件都称为“ I / O设备”,操作系统为它们分配一个唯一的ID号,称为“ handle ”。系统使用此句柄来跟踪设备的属性。
不同的设备具有不同的属性。控制台由其窗口直观地表示,但数据(字符)存储在其缓冲区中。窗口具有其宽度和高度(请参见Console.WindowWidth
和Console.WindowHeight
属性),还有屏幕缓冲区的大小-宽度和高度(请参见Console.BufferWidth
和Console.BufferHeight
属性)。您可以打开,如果手动编辑这些属性命令提示符并转到属性中,如果你在标题栏的左上角点击图标出现的下拉菜单。
当您的应用程序执行时
Console.BufferWidth = 240;
它尝试更改当前输出设备(文件)不存在的属性(窗口缓冲区大小)。您的应用程序已重定向输出,它具有文件的句柄,并且Console.BufferWidth
该对象不支持该句柄。因此,您得到了IOException
(句柄无效)。
有关Console
类如何在重定向的情况下设计代码的MSDN页面:
如果将基础流重定向到文件,则在将基础流定向到控制台时正常工作的控制台类成员可能会引发异常。如果您重定向标准流,则对您的应用程序进行编程以捕获System.IO.IOException异常。您还可以使用IsOutputRedirected,IsInputRedirected和IsErrorRedirected属性来确定是否在执行引发System.IO.IOException异常的操作之前重定向标准流。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句