как сохранить двоичный вывод процесса и сохранить его в файл - PullRequest
0 голосов
/ 23 сентября 2019

Я запускаю exe-файл через Process, который генерирует двоичные данные, и я хочу сохранить эти данные в файл.

, используя обычные предложенные методы для этого (синхронизация и асинхронность) I 'Я столкнулся с несколькими препятствиями, и я надеюсь, что вы мне поможете.

Я выполнил команды через код и через приглашение, и вот мои наблюдения

1) При использованииПри использовании методов синхронизации файл по умолчанию кодируется с помощью UTF-8 (файл заканчивается больше, чем подсказка 2). При изменении метода кодирования на ASCII / по умолчанию кодировка обрабатывается правильно, и файл по размеру похож наПодскажите, к сожалению, процесс, предназначенный для чтения этого файла, считает его «ошибочным». 3) Использование асинхронного метода и сохранение с использованием BinaryWriter создает, казалось бы, точный файл, но все еще не может быть прочитан выводом.Я полагаю, что моя ошибка может быть в том, как я добавляю «новую строку»

ниже мой код для асинхронного метода.В то время как синхронизация только имеет "Output.ReadToEnd ()" между началом / остановкой.

код:

        private void createOCTree()
    {
        //Create process
        var cmd = @"oconv.exe";                         //OUTPUT IS C++ binary
        var arguments = @" C:\RadianceGeometry.rad";
        var outputFile = @"C:\test.oct";
        var workingDir = m_FileData.TemporaryFilesFolder;

        ProcessStartInfo cmdStartInfo = new ProcessStartInfo();
        cmdStartInfo.RedirectStandardInput = false;
        cmdStartInfo.RedirectStandardError = false;
        cmdStartInfo.RedirectStandardOutput = true;
        cmdStartInfo.UseShellExecute = false;
        cmdStartInfo.CreateNoWindow = true;
        cmdStartInfo.FileName = cmd;                    ////file name
        cmdStartInfo.Arguments = arguments;             ////arguments
        cmdStartInfo.WorkingDirectory = @"C:\";         ////working dir

        using (StreamWriter writer = new StreamWriter("C:\\testStream.oct"))
        {
        }

        var process = new Process();
        process.StartInfo = cmdStartInfo;

        process.OutputDataReceived += new DataReceivedEventHandler(OutputHandler);
        process.Start();
        process.BeginOutputReadLine();
        process.WaitForExit();
    }

    private void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
    {
        try
        {
            byte[] bytes = Encoding.Default.GetBytes(outLine.Data);
            byte[] newLine = Encoding.Default.GetBytes("\n");                       
            AppendData("C:\\testStream.oct", bytes);
            AppendData("C:\\testStream.oct", newLine);     ////otherwise all is in one line     
        }
        catch { }   ////possibly last line is not properly handled
    }

    private static void AppendData(string filename, byte[] bits)
    {
        using (var fileStream = new FileStream(filename, FileMode.Append, FileAccess.Write, FileShare.None))
        using (var bw = new BinaryWriter(fileStream))
        {
            bw.Write(bits);
        }
    }

я подозреваю, что либо я что-то упускаю из-за "Try / Catch", либо переводы новой строки должны выполняться по-другому.Установите все пути в c: \ просто, чтобы их было легче читать (вместо использования переменных или реальных путей).

редактировать: дополнение;Я заметил, что при сравнении вывода подсказок с выводом из кода они совпадают, за исключением того, что первый символ из некоторых строк «output» равен «?»вместо случайных «глифов» в рабочем файле.

edit: добавлены сравнительные снимки экрана.сравнение кодов:

с новой строкой: https://ibb.co/HpztQ0Q

без новой строки: https://ibb.co/Lvcr9pH

...