В С# (.NET 4.0 работает под Mono 2.8 на SuSE) я хотел бы запустить внешнюю командную команду и захватить ее вывод в двоичной форме. Внешний инструмент, который я использую, называется "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 в вывод. Основной поток не поддерживает возврат к началу.
И я застрял здесь. У кого-нибудь есть рабочее решение для запуска внешней команды и захвата его stdout в двоичной форме? Вывод может быть очень большим, поэтому я хотел бы передать его.
Любая помощь оценивается.
Кстати, моим текущим обходным решением является то, что samtools возвращают записи в текстовом формате, а затем анализируют их, но это довольно медленно, и я надеюсь ускорить процесс, используя непосредственно двоичный формат.