我試圖做一些看起來應該比較簡單的事情:從C#調用jpegoptim。用RedirectStandardInput和RedirectStandardOutput調用jpegOptim
我可以把它寫到磁盤上,但是讓它接受一個數據流併發射一個數據流到目前爲止一直困擾着我 - 我總是以0長度輸出或不祥的「管道已結束」結束。
一個方法我試過:
var processInfo = new ProcessInfo(
jpegOptimPath,
"-m" + quality + " -T1 -o -p --strip-all --all-normal"
);
processInfo.CreateNoWindow = true;
processInfo.WindowStyle = ProcessWindowStyle.Hidden;
processInfo.UseShellExecute = false;
processInfo.RedirectStandardInput = true;
processInfo.RedirectStandardOutput = true;
processInfo.RedirectStandardError = true;
using(var process = Process.Start(processInfo))
{
await Task.WhenAll(
inputStream.CopyToAsync(process.StandardInput.BaseStream),
process.StandardOutput.BaseStream.CopyToAsync(outputStream)
);
while (!process.HasExited)
{
await Task.Delay(100);
}
// Do stuff with outputStream here - always length 0 or exception
}
我也試過這個解決方案:
http://alabaxblog.info/2013/06/redirectstandardoutput-beginoutputreadline-pattern-broken/
using (var process = new Process())
{
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.FileName = fileName;
process.StartInfo.Arguments = arguments;
process.Start();
//Thread.Sleep(100);
using (Task processWaiter = Task.Factory.StartNew(() => process.WaitForExit()))
using (Task<string> outputReader = Task.Factory.StartNew(() => process.StandardOutput.ReadToEnd()))
using (Task<string> errorReader = Task.Factory.StartNew(() => process.StandardError.ReadToEnd()))
{
Task.WaitAll(processWaiter, outputReader, errorReader);
standardOutput = outputReader.Result;
standardError = errorReader.Result;
}
}
同樣的問題。輸出長度爲0.如果讓jpegoptim在沒有輸出重定向的情況下運行,我可以得到我期望的 - 一個優化的文件 - 但不是當我以這種方式運行時。
有一個正確的方法來做到這一點?
更新:發現一條線索 - 我不覺得羞怯 - jpegoptim從未支持管道到stdin,直到2014年的實驗版本,今年修復。我擁有的版本來自2013年的舊版庫。https://github.com/tjko/jpegoptim/issues/6