【问题标题】:Passing the byte stream from an application to console app using StandardInput?使用StandardInput将字节流从应用程序传递到控制台应用程序?
【发布时间】:2021-05-20 15:00:17
【问题描述】:

我正在尝试使用 Process 方法调用 exe 应用程序,我需要传递 pdf 字节流。在使用标准输入时,我正在尝试这样的事情:

var stream = myexe.StandardInput;
try
{
    stream.Write(content);
}

finally
{
    stream.Close();
}

另一方面,我正在尝试阅读:

var bytesInStream = new byte[10*1024];
var input = Console.OpenStandardInput();
var temp = input.Read(bytesInStream, 0, (int)bytesInStream.Length);

【问题讨论】:

  • 问题出在哪里?
  • Process.StandardInput 是一个 StreamWriter,它使用一种编码将数据转换为二进制。在这种情况下,您不希望这样。尝试使用Process.StandardInput.BaseStream.Write(pdf, 0, pdf.Length)
  • input.Read 只读取一个缓冲区。您可以使用Stream.CopyTo 将传入的字节复制到 MemoryStream 或 FileStream。您应该使用 OpenStandardInpu()StandardInput.BaseStream 来获取进程的输入流而不是 StreamWriter
  • 另外请注意,您需要一种方法让子进程知道它何时读取了正确的字节数。一种方法是在写入所有数据后关闭流,这将导致子进程在读取所有数据后达到文件结束条件。另一种方法是在流中添加一些元数据,告诉子进程要读取多少字节。
  • StdIn 是文本流,特别不适用于 PDF(二进制格式)。请改用文件。

标签: c# .net console-application


【解决方案1】:

如果您查看 Process 类下的 StandardInput 方法,它会返回 StreamWriter。 如果您使用stream.Write(object")。它实际上写入了您可以在另一端读取的字符串值。 对于字节数组pdf流,需要使用

stream.BaseStream.Write(content, 0, content.Length); 

在另一端这样读:

` var input = Console.OpenStandardInput();
  var temp = input.Read(bytesInStream, 0, (int)bytesInStream.Length);`

如果不确定大小,您也可以将字节流长度作为 args 发送。

【讨论】:

    猜你喜欢
    • 2014-05-21
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多