我正在通过Process运行exe文件,该文件会生成二进制数据,并且我想将该数据保存到文件中。
[在使用通常建议的方法(同步和异步)时,我遇到了两个障碍,希望您能为我提供帮助。
我已经通过代码和提示符运行命令,这是我的观察结果
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:\只是为了使其易于阅读(而不是使用变量或实际路径)。
edit:addition;在将提示输出与代码中的提示输出进行比较时,我已经注意到,它们是相同的,只是某些行“输出”的第一个字符为“?”。而不是工作文件中的随机“字形”。
编辑:添加了比较屏幕截图。代码比较:
不带换行符:https://ibb.co/Lvcr9pH
我的工作方式是使用cmd作为命令,在参数字段中,我使用/ c“标志,如下所述:What does cmd /C mean?
String exeFileName = @"cmd.exe";
String Arguments = @"/c oconv.exe C:\test\radgeom.rad > c:\test\scene.oct";