如何在C#中将文件名传递给StandardInput(Process)?

时间:2010-06-02 09:07:18

标签: c# .net command-line process command

我从命令行使用本机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命令行中那样传递文件名,那么它是不行的吗?

3 个答案:

答案 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