Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中将文件名传递给StandardInput(进程)?_C#_.net_Command Line_Process_Command - Fatal编程技术网

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

C# 如何在C中将文件名传递给StandardInput(进程)?,c#,.net,command-line,process,command,C#,.net,Command Line,Process,Command,我在命令行中使用本机windows应用程序spamc.exe SpamAssassin-sawin32,如下所示: C:\SpamAssassin\spamc.exe-R

我在命令行中使用本机windows应用程序spamc.exe SpamAssassin-sawin32,如下所示:

C:\SpamAssassin\spamc.exe-R 现在我想从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命令行中那样只传递文件名,则不起作用?

在第一个示例中,您传递的是表示文件而不是文件的字符串。

您的第一个代码示例相当于从包含行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();
}