Как передать имя файла в StandardInput (процесс) в C #? - PullRequest
0 голосов
/ 02 июня 2010

Я использую собственное приложение 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?

Ответы [ 3 ]

5 голосов
/ 02 июня 2010

Это потому, что в командной строке < - это маленький магический параметр . Это просто немного больше, чем вы, возможно, ожидаете. Фактически он открывает файл и помещает его содержимое в стандартный ввод процесса. То же самое вы должны сделать вручную при использовании класса Process.

Как вы уже показали во втором примере, вы должны использовать StreamReader, чтобы получить содержимое файла и поместить его в StandardInput. Просто чтобы сделать его немного более надежным, вы можете использовать этот небольшой фрагмент кода:

using (var streamReader = new StreamReader(fileInfo.FullName))
{
    process.StandardInput.Write(streamReader.ReadToEnd());
    process.StandardInput.Flush();
}
2 голосов
/ 02 июня 2010

В первом примере вы передаете строку, которая представляет файл, а не файл .

1 голос
/ 02 июня 2010

Ваш первый пример кода эквивалентен направлению ввода из файла, содержащего строку C:\email.eml:

echo C:\email.eml > inputfile
C:\SpamAssassin\spamc.exe -R < inputfile

Ваш второй пример кода передает содержимое C:\email.eml в spamc.

...