我的 C# 程序出现错误“进程试图写入不存在的管道”

bar*_*lop 2 c# console

我在尝试编写显示大文件前 5 行的程序时遇到错误。

C:\blah\aeea2>for /L %f in (1,1,500) do @echo zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz >>testfile
Run Code Online (Sandbox Code Playgroud)

上面生成了我的文件。它有 500 行,每行都有 z 字符。

C:\blah\aeea2>dir
 Volume in drive C has no label.
 Volume Serial Number is B411-D580

 Directory of C:\blah\aeea2

16/10/2016  05:48 AM    <DIR>          .
16/10/2016  05:48 AM    <DIR>          ..
16/10/2016  05:42 AM               388 prog.csc
16/10/2016  05:42 AM             4,096 prog.exe
16/10/2016  05:48 AM            19,500 testfile
               3 File(s)         23,984 bytes
               2 Dir(s)   2,879,127,552 bytes free
Run Code Online (Sandbox Code Playgroud)

你在这里看到我的程序

C:\blah\aeea2>type prog.csc
class a{
   public static void Main(string[] args) {
       string line;
       System.Collections.Generic.List<string> lststr = new System.Collections.Generic.List<string>();
       int i=0;
       while( (line=System.Console.In.ReadLine())!=null ) {i++;  lststr.Add(line);  if(i==5) break;}
       for(i=0; i<lststr.Count; i++) System.Console.WriteLine(lststr[i]);
   }
}
Run Code Online (Sandbox Code Playgroud)

这是错误

C:\blah\aeea2>type testfile| prog.exe
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
The process tried to write to a nonexistent pipe.

C:\blah\aeea2>
Run Code Online (Sandbox Code Playgroud)

但它适用于非常小的文件

C:\blah\aeea2>type smallfile.txt
a
b
c
d
e
f
g
h
i
j
C:\blah\aeea2>type smallfile.txt| prog.exe
a
b
c
d
e

C:\blah\aeea2>
Run Code Online (Sandbox Code Playgroud)

Zby*_*000 5

这不是你的程序,它实际上是命令type。

type将尝试将完整的文件内容写入管道并将其发送到您的程序。但您的程序仅消耗前 5 行并退出。因此type抱怨不再存在的消费者(管道)。

为了使其在没有警告/错误的情况下工作,最好消耗完整的输入,而不是在之后中断i == 5并丢弃它。但是,它会通过读取不需要的内容来浪费 CPU 和 IO。

它适用于较小文件的原因是剩余字节适合管道缓冲区(通常为 4kB、8kB,在所有 Windows 系统上并非 100% 确定)。

添加者: 巴洛普

涉及上述内容以及命令、gnuwin32 cat、cygwin cat、环境 cmd 和 cygwin 的一些有趣的发现,我发现了以下内容。

通过 zbynek 的调整(使我的程序读取大量内容),它们都可以工作(/不会遇到错误)。

但如果没有兹比涅克的调整——

gnuwin32 cat 命令在 cmd 中不起作用,它的行为与 type 类似,并且在输出行后,它显示“写入错误:无效参数”

如果从 cmd 执行 cygwin cat 命令,则不起作用,它显示“写入错误:设备上没有剩余空间”

Windows 的“more”命令在 cmd 中运行(或者不出所料,在 cygwin 中运行)。因此可以使用它来代替“类型”。

从 cygwin 开始,cat - 无论是 gnuwin32 cat 还是 cygwin cat,都可以工作。

我会从 cygwin 测试“类型”,但我尝试过,但我不认为 cygwin 可以运行类型,它内置于 cmd.exe shell 中,没有自己的可执行文件,我不认为 cygwin 可以看到它。