C# 如何在C中将文件名传递给StandardInput(进程)?
我在命令行中使用本机windows应用程序spamc.exe SpamAssassin-sawin32,如下所示: C:\SpamAssassin\spamc.exe-RC# 如何在C中将文件名传递给StandardInput(进程)?,c#,.net,command-line,process,command,C#,.net,Command Line,Process,Command,我在命令行中使用本机windows应用程序spamc.exe SpamAssassin-sawin32,如下所示: C:\SpamAssassin\spamc.exe-R
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.FileName = @"C:\SpamAssassin\spamc.exe";
p.StartInfo.Arguments = @"-R";
p.Start();
p.StandardInput.Write(@"C:\email.eml");
p.StandardInput.Close();
Console.Write(p.StandardOutput.ReadToEnd());
p.WaitForExit();
p.Close();
上面的代码只是将文件名作为字符串传递给spamc.exe,而不是文件的内容。然而,这一点是有效的:
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.FileName = @"C:\SpamAssassin\spamc.exe";
p.StartInfo.Arguments = @"-R";
p.Start();
StreamReader sr = new StreamReader(@"C:\email.eml");
string msg = sr.ReadToEnd();
sr.Close();
p.StandardInput.Write(msg);
p.StandardInput.Close();
Console.Write(p.StandardOutput.ReadToEnd());
p.WaitForExit();
p.Close();
有人能告诉我为什么我读了文件并把内容传给spamc,但是,如果我像在windows命令行中那样只传递文件名,则不起作用?在第一个示例中,您传递的是表示文件而不是文件的字符串。您的第一个代码示例相当于从包含行C:\email.eml的文件中定向输入:
您的第二个代码示例将C:\email.eml的内容传递给spamc。这是因为在命令行上,确定了,那么传递文件的正确方法是什么?除了第二个示例之外,还有其他解决方案吗?除了更改程序以打开文件本身,您的第二个解决方案是一个不错的方法。
echo C:\email.eml > inputfile
C:\SpamAssassin\spamc.exe -R < inputfile
using (var streamReader = new StreamReader(fileInfo.FullName))
{
process.StandardInput.Write(streamReader.ReadToEnd());
process.StandardInput.Flush();
}