我从命令行使用本机Windows应用程序spamc.exe(SpamAssassin - sawin32),如下所示:
C:\ SpamAssassin \ spamc.exe -R< C:\ email.eml
现在我想从C#中调用这个过程:
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命令行中那样传递文件名,那么它是不行的吗?
答案 0 :(得分:5)
这是在命令行上导致<
是一个魔术参数。它只是做了一点点,然后你可能会期待。实际上,它会打开文件并将其内容放入流程的标准输入中。因此,在使用Process类时必须手动执行此操作。
正如您在第二个示例中所示,您必须使用StreamReader获取文件的内容并将其放入StandardInput
。为了使它更强大,你可以使用这个小代码片段:
using (var streamReader = new StreamReader(fileInfo.FullName))
{
process.StandardInput.Write(streamReader.ReadToEnd());
process.StandardInput.Flush();
}
答案 1 :(得分:2)
在第一个示例中,您传递的字符串代表的文件不是文件。
答案 2 :(得分:1)
您的第一个代码示例相当于从包含行C:\email.eml
的文件中引导输入:
echo C:\email.eml > inputfile
C:\SpamAssassin\spamc.exe -R < inputfile
您的第二个代码示例将C:\email.eml
的内容传递给spamc
。