比較的単純なはずのことをしようとしています.C#からjpegoptimを呼び出します。
私はそれをディスクにうまく書き込むことができますが、ストリームを受け入れてストリームを発行するようにすることは、これまでのところ私を避けてきました-私は常に長さ0の出力または不吉な「パイプが終了しました」になります。
私が試した1つのアプローチ:
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 は、2014 年の実験的なビルドまで stdin へのパイプをサポートしていませんでした。今年修正されました。私が持っているビルドは、2013 年の古いライブラリからのものです。https://github.com/tjko/jpegoptim/issues/6