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

时间:2016-10-16 04:51:54

标签: c# console

尝试编写显示大文件前5行的程序时出错。

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

以上生成我的文件。它是500行,每行有z个字符。

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]);
   }
}

你在这里看到我的节目

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

C:\blah\aeea2>

这是错误

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>

但它适用于非常小的文件

n-th

1 个答案:

答案 0 :(得分:2)

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

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

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

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

barlop

添加了

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

他们都工作(/不会遇到错误),zbynek的调整(让我的程序读取很多)。

但没有zbynek的调整 -

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

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

windows'more'命令可以在cmd中运行(或者不出所料,来自cygwin)。这样就可以代替'type'。

从cygwin,cat - gnuwin32 cat或cygwin cat,工作。

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