【问题标题】:About redirected stdout in System.Diagnostics.Process关于 System.Diagnostics.Process 中的重定向标准输出
【发布时间】:2010-05-29 05:23:51
【问题描述】:

我最近一直在开发一个使用 flac.exe 和 lame.exe 在 C# 中将 flac 文件转换为 mp3 的程序,以下是完成这项工作的代码:

ProcessStartInfo piFlac = new ProcessStartInfo( "flac.exe" );
piFlac.CreateNoWindow = true;
piFlac.UseShellExecute = false;
piFlac.RedirectStandardOutput = true;
piFlac.Arguments = string.Format( flacParam, SourceFile );

ProcessStartInfo piLame = new ProcessStartInfo( "lame.exe" );
piLame.CreateNoWindow = true;
piLame.UseShellExecute = false;
piLame.RedirectStandardInput = true;
piLame.RedirectStandardOutput = true;
piLame.Arguments = string.Format( lameParam, QualitySetting, ExtractTag( SourceFile ) );

Process flacp = null, lamep = null;
byte[] buffer = BufferPool.RequestBuffer();


flacp = Process.Start( piFlac );
lamep = new Process();
lamep.StartInfo = piLame;
lamep.OutputDataReceived += new DataReceivedEventHandler( this.ReadStdout );
lamep.Start();
lamep.BeginOutputReadLine();

int count = flacp.StandardOutput.BaseStream.Read( buffer, 0, buffer.Length );

while ( count != 0 )
{
    lamep.StandardInput.BaseStream.Write( buffer, 0, count );

    count = flacp.StandardOutput.BaseStream.Read( buffer, 0, buffer.Length );
}

这里我设置命令行参数告诉lame.exe将其输出写入stdout,并利用Process.OutPutDataRecerved事件收集输出数据,输出数据主要是二进制数据,但DataReceivedEventArgs.Data是键入“string”,我必须将其转换为 byte[] 才能将其放入缓存,我认为这很难看,我尝试了这种方法,但结果不正确。

有什么方法可以绕过 OutputDataReceived 事件以同步或异步方式读取原始重定向的标准输出流?

PS:我之所以不使用lame直接写入磁盘是因为我在尝试并行转换多个文件,直接写入磁盘会造成严重的碎片。

非常感谢!

【问题讨论】:

    标签: c# .net stream


    【解决方案1】:

    我不认为 lame 和 flac 使用 Stdout 来输出其转换后的数据。我认为他们将转换后的文件直接写入磁盘。 StdOut 仅用于输出信息/错误消息。

    【讨论】:

    • 有一个命令行开关告诉 flac 写入标准输出,也用于 lame。我试图让跛脚写入标准输出并在命令行提示符下重定向到一个文件,它可以工作。
    • 好的。但由于 .Net 期望标准输出是字符串,它可能会将输出数据中的零解释为“字符串结尾”。这可能是你的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多