- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 C# 中(.NET 4.0 在 SuSE 上的 Mono 2.8 下运行)我想运行一个外部批处理命令并以二进制形式捕获它的输出。我使用的外部工具称为“samtools”(samtools.sourceforge.net),除其他外,它可以从称为 BAM 的索引二进制文件格式返回记录。
我使用 Process.Start 来运行外部命令,并且我知道我可以通过重定向 Process.StandardOutput 来捕获它的输出。问题是,这是一个带有编码的文本流,所以它不允许我访问输出的原始字节。我找到的几乎可行的解决方案是访问底层流。
这是我的代码:
Process cmdProcess = new Process();
ProcessStartInfo cmdStartInfo = new ProcessStartInfo();
cmdStartInfo.FileName = "samtools";
cmdStartInfo.RedirectStandardError = true;
cmdStartInfo.RedirectStandardOutput = true;
cmdStartInfo.RedirectStandardInput = false;
cmdStartInfo.UseShellExecute = false;
cmdStartInfo.CreateNoWindow = true;
cmdStartInfo.Arguments = "view -u " + BamFileName + " " + chromosome + ":" + start + "-" + end;
cmdProcess.EnableRaisingEvents = true;
cmdProcess.StartInfo = cmdStartInfo;
cmdProcess.Start();
// Prepare to read each alignment (binary)
var br = new BinaryReader(cmdProcess.StandardOutput.BaseStream);
while (!cmdProcess.StandardOutput.EndOfStream)
{
// Consume the initial, undocumented BAM data
br.ReadBytes(23);
//...更多解析如下
但是当我运行它时,我读取的前 23 个字节不是输出中的前 23 个字节,而是下游的数百或数千个字节。我假设 StreamReader 做了一些缓冲,所以底层流已经提前说 4K 到输出中。底层流不支持寻回起点。
我被困在这里了。有没有人有运行外部命令并以二进制形式捕获其标准输出的有效解决方案?输出可能非常大,所以我想流式传输它。
感谢任何帮助。
顺便说一句,我目前的解决方法是让 samtools 以文本格式返回记录,然后解析这些记录,但这非常慢,我希望通过直接使用二进制格式来加快速度。
最佳答案
使用 StandardOutput.BaseStream
是正确的方法,但您不得使用 cmdProcess.StandardOutput
的任何其他属性或方法。例如,访问 cmdProcess.StandardOutput.EndOfStream
将导致 StandardOutput
的 StreamReader
读取部分流,删除您要访问的数据.
相反,只需从 br
中读取和解析数据(假设您知道如何解析数据,并且不会读取超过流的末尾,或者愿意捕获 EndOfStreamException
)。或者,如果您不知道数据有多大,请使用 Stream.CopyTo
将整个标准输出流复制到新文件或内存流。
关于c# - 从 Process.StandardOutput 捕获二进制输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21793810/
我正在研究 C++/CLI winforms 如何将标准输出重定向到文本框? 我关注了这个视频,但没有成功 https://www.youtube.com/watch?v=BDTCviA-5M8 我可
我正在尝试使用 C# 来控制命令行应用程序后台,可以在这里下载:http://www.ti.com/litv/zip/spmc015b 这是一个电机电压控制的应用程序,当我进入应用程序时,如“b.ex
我正在尝试做一些似乎超出 System.Diagnostics.Process 对象范围的事情。可接受的答案可以提出不同的方法,只要它使用 .net 4.5/c#5。 我的程序正在调用 gdalwar
我有一个使用 BeginOutputReadLine 以异步模式启动命令行进程的程序。我的问题是 .Exited 事件在仍有一些 .OutputDataReceived 事件被触发时被触发。我在 .E
我正在用类似于下面的代码开始一个过程: // some of the flags are not needed process.StartInfo.CreateNoWindow = true; pro
我使用 C# 处理进程(使用 Process 和 ProcessStartInfo)已经有一段时间了。现在只有一个问题一直困扰着我,一直没有找到解决的办法。 当应用程序“等待”某些输入时,Standa
我正在我的 C# 应用程序中启动一个进程,该进程运行一个控制台应用程序。我已经重定向了标准输入和输出,并且能够通过 StandardOutput.ReadLine() 读取几行。我确信我已正确配置 P
这个问题在这里已经有了答案: ProcessStartInfo hanging on "WaitForExit"? Why? (22 个答案) 关闭 5 年前。 我有一个经常使用外部程序并读取其输出
我有这个小函数,可以让我在处理可怕的 System.Diagnostics.Process API 时省去一些麻烦: let HiddenExec (command: string, argument
我正在尝试获取输出以显示我机器上当前打开的文档,但无论如何它都返回 NULL。 StringCollection values = new StringCollection(); var proc =
在 this 之上问题,我还有一个。我尝试从外部进程获取二进制数据,但数据(图像)似乎已损坏。下面的屏幕截图显示了损坏:左图是通过在命令行上执行程序完成的,右图是通过代码完成的。 到目前为止我的代码:
在 C# 中(.NET 4.0 在 SuSE 上的 Mono 2.8 下运行)我想运行一个外部批处理命令并以二进制形式捕获它的输出。我使用的外部工具称为“samtools”(samtools.sour
我正在读取使用 Process 启动的 java 应用程序的输出,并读取 stdError、stdOutout 并使用 stdInput 发送命令。相关代码如下: int mem =
我正在尝试从 C# 运行命令行实用程序 PCLI.exe,但没有成功。我正在构建一个 ProcessStartInfo 对象并设置了 process.StartInfo.RedirectStandar
我试图理解为什么当我调用上述函数时,我在读取的输出中每第 80 列得到十六进制 0D0A。 我有一个 powershell 脚本,为了简洁起见,其中有两行用于测试: $xmlSpew = "Defau
我正在启动一个控制台应用程序,但是当我重定向标准输出时,我总是什么也得不到! 当我不重定向它,并将 CreateNoWindow 设置为 false 时,我在控制台中正确地看到了所有内容,但是当我重定
我read这部分代码可能会导致死锁: Process p = new Process(); p.StartInfo.UseShellExecute = false; p.StartInfo.Re
这个问题以前不止一次被问过,但我在这些讨论中都没有找到满意的答案。 我正在启动一个命令行进程,为 STDOUT 生成实时测量值,大约每秒生成一个新结果。使用 System.Diagnostics.Pr
在 C# 中(.NET 4.0 在 SuSE 上的 Mono 2.8 下运行)我想运行一个外部批处理命令并以二进制形式捕获它的输出。我使用的外部工具称为“samtools”(samtools.sour
是否可以在 Gradle 中的 JavaExec 命令上将 java 命令添加到标准输出流? 即 task importSitesDef(dependsOn: init, type: JavaExec
我是一名优秀的程序员,十分优秀!