如何保存进程的二进制输出并将其保存到文件中

问题描述 投票:0回答:1

我正在通过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/HpztQ0Q

不带换行符:https://ibb.co/Lvcr9pH

c# asynchronous process binary output
1个回答
0
投票

我的工作方式是使用cmd作为命令,在参数字段中,我使用/ c“标志,如下所述:What does cmd /C mean?

    String exeFileName = @"cmd.exe";
    String Arguments = @"/c oconv.exe C:\test\radgeom.rad > c:\test\scene.oct"; 
© www.soinside.com 2019 - 2024. All rights reserved.