Я запускаю 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