Search code examples
processsystem.diagnosticsprocessstartinfo

System.Diagnostics.Process issue with WorkingDirectory


I am using a third party software tool (command line tool) to merge PDF files together. Using C# I am attempting to use System.Diagnostics.Process to run the executable but I am coming up with a few errors depending on the parameter setup.

  • If UseShellExecute = true and RedirectStandardOutput = true I get:
    • The Process object must have the UseShellExecute property set to false in order to redirect IO streams.
  • If UseShellExecute = true and RedirectStandardOutput = false I get:
    • The system cannot find the file specified
  • If useShellExecute = false and RedirectStandardOutput = true I get:
    • The system cannot find the file specified
  • If UseShellExecute = false and RedirectStandardOutput = false I get:
    • The system cannot find the file specified

The code that is running is the following:

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();

Can someone help me get around this issue, please?


Solution

  • Arguments shouldn't be passed in the FileName property. You should use the Arguments property for this:

    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";
    

    where the GetProgramFilesX86 function is could be defined like so:

    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");
    }