System.Diagnostics.Process проблема с WorkingDirectory - PullRequest
3 голосов
/ 11 февраля 2010

Я использую сторонний программный инструмент (инструмент командной строки) для объединения PDF-файлов. Используя C #, я пытаюсь использовать System.Diagnostics.Process для запуска исполняемого файла, но у меня возникает несколько ошибок в зависимости от настройки параметра.

  • Если UseShellExecute = true и RedirectStandardOutput = true, я получаю:
    • Объект Process должен иметь свойство UseShellExecute, установленное на false, чтобы перенаправлять потоки ввода-вывода.
  • Если UseShellExecute = true и RedirectStandardOutput = false, я получаю:
    • Система не может найти указанный файл
  • Если useShellExecute = false и RedirectStandardOutput = true, я получаю:
    • Система не может найти указанный файл
  • Если UseShellExecute = false и RedirectStandardOutput = false, я получаю:
    • Система не может найти указанный файл

Код, который выполняется:

Process p = new Process();

p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = false;
p.StartInfo.WorkingDirectory = "C:\\Program Files (x86)\\VeryPDF PDF Split-Merge v3.0";
p.StartInfo.FileName = "pdfpg.exe " + strFileNames.Trim() + " " 
                       + D2P_Folder_Converted + "\\" + strOutputFileName;
p.Start();
p.WaitForExit();
p.Close();
p.Dispose();

Может кто-нибудь помочь мне обойти эту проблему, пожалуйста?

Ответы [ 3 ]

8 голосов
/ 11 февраля 2010

Когда UseShellExecute равно false, свойство WorkingDirectory меняет свое значение!

становится рабочим каталогом для нового процесса. НЕ путь к исполняемому файлу. Вместо этого вам нужно указать полный путь к исполняемому файлу в свойстве FileName.

3 голосов
/ 11 февраля 2010

Аргументы не должны передаваться в свойстве FileName . Для этого вы должны использовать свойство Arguments :

p.StartInfo.Arguments = string.Format(
    "{0} {1}", 
    strFileNames.Trim(), 
    Path.Combine(D2P_Folder_Converted, strOutputFileName)
);
p.StartInfo.WorkingDirectory = Path.Combine(GetProgramFilesX86(), "VeryPDF PDF Split-Merge v3.0");
p.StartInfo.FileName = "pdfpg.exe";

где функция GetProgramFilesX86 может быть определена так:

static string GetProgramFilesX86()
{
    var processorArchitecture = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432");
    if(IntPtr.Size == sizeof(long) || !string.IsNullOrEmpty(processorArchitecture))
    {
        return Environment.GetEnvironmentVariable("ProgramFiles(x86)");
    }
    return Environment.GetEnvironmentVariable("ProgramFiles");
}
0 голосов
/ 11 февраля 2010

Я не эксперт по использованию API процесса, но похоже, что вы помещаете аргументы командной строки в FileName. Попробуйте использовать аргументы для аргументов командной строки. И укажите полный путь к exe в FileName.

Также использование @ перед строкой избавляет от необходимости удваивать обратную косую черту.

p.StartInfo.FileName = @"C:\Program Files (x86)\VeryPDF PDF Split-Merge\pdfpg.exe" 
...