C#控制台程序使用<重定向输入无响应,传参运行正常问题排查
问题根因
命令行中的<是输入重定向符,属于命令提示符(Shell)的语法关键字,不会被当做参数传递给程序,Shell会直接把<后面的文件内容注入到程序的标准输入流(Console.In)中,此时程序拿到的args数组是空的。
你原来的代码存在两个核心问题:
args.Length == 0的分支只调用了一次Console.ReadLine(),仅会读取输入流的第一行,如果输入文件没有换行符,该方法会一直等待换行输入,就会出现无响应的现象;如果输入流到末尾返回null,调用Split还会触发空引用异常。- 空参数分支按空格分割内容、读文件分支按换行分割内容的逻辑不一致,两种调用方式的处理结果会出现偏差。
你观察到的test.exe < indata.txt indata.txt能正常运行,本质是Shell解析完输入重定向规则后,把剩下的第二个indata.txt作为第一个参数传入了程序,args.Length == 1就会走读文件的逻辑,并不是<跳过了第一个参数,而是<和紧跟的第一个文件名被Shell直接消费了,不会进入程序的参数列表。
修复方案
调整代码兼容参数传文件路径、标准输入流传内容两种调用方式,统一处理逻辑即可:
static void Main(string[] args) { string[] buffer_array; if (args.Length == 0) { // 读取全部标准输入流内容,适配输入重定向场景 string allInput = Console.In.ReadToEnd(); // 和读文件逻辑保持统一,按换行分割内容 buffer_array = allInput.Split('\n'); } else { string path = Path.Combine("./", args[0]); Console.WriteLine(path); // 加using关键字自动释放文件资源,避免泄漏 using StreamReader read_string = File.OpenText(path); string s = read_string.ReadToEnd(); buffer_array = s.Split('\n'); } // 后续处理buffer_array的逻辑 }
内容的提问来源于stack exchange,提问作者Robert Häggkrantz
相关产品推荐
相关产品推荐

