C# C中进程重定向与Shell重定向#

C# C中进程重定向与Shell重定向#,c#,shell,io-redirection,processstartinfo,C#,Shell,Io Redirection,Processstartinfo,我正在尝试让LibJPEG-turbo的可执行文件cjpeg.exe(带有Windows官方二进制文件)在我创建的DLL中工作,以处理大图像的批处理。我正在使用VisualStudio2010和.NET4。使用此vs.NETs jpeg编码器/解码器的原因是质量和速度都要高得多,而且其他库(如BitMiracles.NETJPEG库)的速度非常慢,即使在我添加了一些不安全的代码以加速库的某些部分(如读取位图数据)后也是如此 我第一次尝试使用cjpeg.exe是使用流程类流重定向: Process

我正在尝试让LibJPEG-turbo的可执行文件cjpeg.exe(带有Windows官方二进制文件)在我创建的DLL中工作,以处理大图像的批处理。我正在使用VisualStudio2010和.NET4。使用此vs.NETs jpeg编码器/解码器的原因是质量和速度都要高得多,而且其他库(如BitMiracles.NETJPEG库)的速度非常慢,即使在我添加了一些不安全的代码以加速库的某些部分(如读取位图数据)后也是如此

我第一次尝试使用cjpeg.exe是使用流程类流重定向:

ProcessStartInfo pi = new ProcessStartInfo();
pi.FileName = @"C:\Users\spl3001\Documents\Visual Studio 2010\Projects\TurboJpeg\TurboJpeg\cjpeg.exe";
pi.RedirectStandardOutput = true;
pi.RedirectStandardInput = false;
pi.RedirectStandardError = true;
pi.UseShellExecute = false;
pi.CreateNoWindow = true;
pi.Arguments = " -quality " + quality.ToString() + " \"" + inFile + "\"";
然后使用此代码将数据写入文件:

Process proc = new Process();
proc.StartInfo = pi;

proc.Start();

string data = proc.StandardOutput.ReadToEnd();
StreamWriter sw = new StreamWriter(outFile);
sw.Write(data);
sw.Close();

proc.WaitForExit();
我得到的是一个JPEG“文件”,里面有一些JPEG数据,但标题不太正确(都来自十六进制编辑器ASCII视图):

而不是

ÿØÿà..JFIF......
这是在cjpeg.exe对通过普通shell使用(在cmd shell中键入)创建的示例数据运行时创建的。第一个错误的文件不会加载到任何查看器软件中,而第二个文件工作正常

我认为这与标准输出流作为字符串读取以及在将其作为文件写入时对数据进行UTF-8处理有关。此外,顶部代码创建的输出文件比手动创建的输出文件大

我的下一次尝试是关闭所有重定向,并在参数中使用shell标准输出重定向操作符“>outputfile”,这是cjpeg.exe的推荐用法。这只是抛出了一个错误,表示cjpeg接收的输入文件太多

但是,如果我将参数字符串复制出来,与在程序中运行时完全相同,并手动运行,则它工作正常


如果您有任何建议,我将不胜感激。

在查看了cjpeg.exe可用的开关后,我意识到有一个“-outfile”开关。那很好用。他们使用的一个例子是“>”shell重定向,因此我认为没有其他方法。

这是在十六进制编辑器中查看的。更正:“FF D8 FF E0 00 10 4A 46 49 00 01 00 01”与不正确:“C3 BF C3 98 C3 BF C3 A0 00 10 4A 46 49 46 00 01”-每个文件的十六进制字节@汉帕桑
ÿØÿà..JFIF......