我有两个进程要与C#一起管道,然后将第二个进程的输出直接发送到HTTP输出流。
在命令行中,我可以做到这一点并且它完美地工作(其中“ - ”代表stdin / stdout):
proc1 "file_to_input" - | proc2 - -
我的问题是在C#中连接这两个进程并且能够获取proc2的STDOUT并将其直接移植到Web上,而不首先缓冲整个事物。输入和输出将是二进制数据类型,因此我需要将其从默认的StreamReader / Writer转换。
这是可能的,最好的方法是什么?谢谢!
答案 0 :(得分:0)
除非我误解你,否则这是正常的“从一个流读取,写入另一个流”的情况,你声明一个大小的缓冲区,只是继续读取输入并写入输出,直到没有剩下从输入中读取。
在.NET 4.0中,他们在Stream上添加了一个CopyTo方法,以简化这一过程,但您可以自己执行相同的代码。
Stream source = ...;
Stream destination = ...;
byte[] buffer = new byte[4096];
int read;
while ((read = source.Read(buffer, 0, buffer.Length)) != 0) {
destination.Write(buffer, 0, read);
}
在你的情况下,听起来你可以通过Console.OpenStandardInput获取源代码 - 对于目的地我不是100%确定你的意思是“将它直接移植到网络上”,但因为我们是一个控制台应用程序而不是一个asp.net页面,我假设你把它发送到某个目标页面。如果您使用的是WebClient,则可以使用其OpenWrite方法。如果它是一个asp.net页面,从一个单独的进程读取它,它可以将它写入Response.OutputStream。
相关链接:
答案 1 :(得分:0)
尝试CliWrap:
var cmd1 = Cli.Wrap("proc1").WithArguments(a => a.Add("file_to_input").Add("-"));
var cmd2 = Cli.Wrap("proc2").WithArguments(a => a.Add("-").Add("-"));
await (cmd1 | cmd2).ExecuteAsync();
如果您想将输出重定向到其他流(例如HTTP流),则:
var output = new MemoryStream();
var cmd1 = ...;
var cmd2 = ...;
await (cmd1 | cmd2 | output).ExecuteAsync();