0

我需要通过 GnuPG 加密来加密文件的内容。为此,我从 FILE 中获取内容并通过 StandardInput 传递它。对于小数据,它工作正常,但是当我尝试写入超过 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。我认为标准输入默认处于文本模式,如果通过某些特定字节(如 EOF 或 NULL)可能会被破坏。请参阅https://stackoverflow.com/a/1284753/717732

编辑:

我在我的评论中是正确的 - 如果子进程读取数据的速度不够快(或根本不读取),则流缓冲区将被阻塞并且所有写入都会阻塞,就像缓冲区为空时读取阻塞一样。参见示例如何避免标准输入卡在 c# 进程中

您可以轻松地验证这一点:创建一个在无限循环中从标准输入读取的微型应用程序。然后,用一个很小的测试应用程序临时替换您的 gpgexecutable 路径,看看是否阻塞。它很可能不会阻塞。

您绝对应该检查为什么子进程没有读取您尝试发送的数据。也许命令行参数是错误的?或者,如果一切看起来都很好,只是子进程工作得这么慢(您可以在 TaskMonitor 中检查进程的活动 - gpg 是休眠还是旋转?),然后将流编写代码放入一些后台工作程序中。

于 2012-09-19T14:40:00.960 回答