2010-05-29 2 views
0

Я недавно работал над программой, которая конвертировать FLAC файлы mp3 в C# с помощью flac.exe и lame.exe, вот код, который делает работу:О перенаправлены стандартном выводе в System.Diagnostics.Process

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 типа «строка», и я должен преобразовать его в байт [], прежде чем положить его в кеш, я думаю, что это уродливо, и я пробовал этот подход, но результат неверен.

Есть ли способ, которым я могу читать поток перенаправленного исходного потока, либо синхронно, либо асинхронно, минуя событие OutputDataReceived?

PS: причина, по которой я не использую хромой для записи на диск, заключается в том, что я пытаюсь преобразовать несколько файлов параллельно, и прямая запись на диск вызовет сильную фрагментацию.

Большое спасибо!

ответ

0

Я не думаю, что lame и flac использует Stdout для вывода преобразованных данных. Я думаю, что они записывают преобразованные файлы непосредственно на диск. StdOut используется только для вывода информации/сообщений об ошибках.

+0

есть переключатель командной строки, чтобы указать flac для записи в stdout, а также для хромого. Я попытался сделать хромой, чтобы написать stdout и перенаправить файл в командной строке, и он работает. – sforester

+0

OK. Но поскольку .Net ожидает, что stdout будет строкой, возможно, интерпретирует нули в выходных данных как «конец строки». Это может быть вашей проблемой. – logicnp

Смежные вопросы