0

ファイルの内容を GnuPG 暗号化で暗号化する必要があります。そのために、FILE からコンテンツをフェッチし、それを StandardInput 経由で Process に渡します。小さなデータの場合は問題なく動作しますが、500KB を超えるデータの StandardInput を書き込もうとすると、プログラムが動かなくなります。

    process = new Process();
     process.StartInfo.WorkingDirectory = _bindirectory;
     process.StartInfo.RedirectStandardInput = true;
     process.StartInfo.RedirectStandardOutput = true;
     process.StartInfo.RedirectStandardError = true;
     process.StartInfo.FileName = gpgExecutable;
     process.StartInfo.Arguments = gpgOptions;
     process.StartInfo.UseShellExecute = false;
     process.StartInfo.CreateNoWindow = true;

     process.Start();
/*****Here is the line where Compiler Process Stucks on large data****/
     process.StandardInput.Write(inputText); 
     process.StandardInput.Flush();
     process.StandardInput.Close();

     process.OutputDataReceived += process_OutputDataReceived;
     process.ErrorDataReceived += process_ErrorDataReceived;
     process.BeginErrorReadLine();
     process.BeginOutputReadLine();
     process.WaitForExit();

解決策を提案してください。ファイルのデータをチャンクで送信する必要がありますか???

4

1 に答える 1

0

ところで、あなたが通過しようとしているデータは何ですか? テキストデータですか、それともバイナリデータですか?バイナリの場合は、StandardInput.BaseStream代わりに に書き込んでみてください。stdin はデフォルトでテキスト モードになっており、EOF や NULL などの特定のバイトが渡されると破損する可能性があると思います。https://stackoverflow.com/a/1284753/717732を参照

編集:

私は私のコメントのとおりです-子プロセスがデータを十分に速く読み取らない(またはまったく読み取らない)場合、ストリームバッファーはチョークされ、すべての書き込みがブロックされます。バッファーが空のときに読み取りがブロックされるのと同じです。たとえば、標準入力がc#プロセスで動かなくなるのを回避する方法を参照してください

これは簡単に確認できます。無限ループで stdin から読み取る小さなアプリケーションを作成します。次に、一時的に gpgexecutable パスをその 1 つの小さなテスト アプリに置き換えて、ブロックするかどうかを確認します。ほとんどの場合、ブロックされません。

子プロセスが送信しようとしているデータを読み取っていない理由を必ず確認する必要があります。コマンドラインのパラメータが間違っているのではないでしょうか? または、すべて問題なく、子プロセスの動作が非常に遅い場合 (TaskMonitor でプロセスのアクティビティを確認できます - gpg はスリープまたはスピンしますか?)、ストリーム書き込みコードをバックグラウンド ワーカーに入れます。

于 2012-09-19T14:40:00.960 に答える