我需要通过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();
请建议解决方案? 我应该以块的形式发送文件数据吗?
答案 0 :(得分:0)
顺便问一下,您尝试通过的数据是什么?是文本还是二进制数据?如果是二进制文件,请尝试写入StandardInput.BaseStream
。我认为stdin在默认情况下处于文本模式,如果传递了某些字节,如EOF或NULL,则会被破坏。请参阅https://stackoverflow.com/a/1284753/717732
编辑:
我在评论中是正确的 - 如果子进程没有足够快地读取数据(或者根本没有读取),则流缓冲区将被阻塞并且所有写入都将被阻塞,就像缓冲区时的读取阻塞一样空。请参阅示例How to avoid standard input getting stuck in c# process
您可以轻松地验证这一点:创建一个在无限循环中从stdin读取的小应用程序。然后,暂时用一个微小的测试应用程序替换你的gpgexecutable路径,看看是否有块。它很可能不会阻止。
您一定要检查子进程没有读取您尝试发送的数据的原因。也许命令行参数错了?或者如果一切看起来都很好而且只是子进程工作得那么慢(你可以在TaskMonitor中查看进程的活动 - gpg是休眠还是旋转?),然后将流编写代码放到一些后台工作中......