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