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
andRedirectStandardOutput = true
I get:- The Process object must have the
UseShellExecute
property set tofalse
in order to redirect IO streams.
- The Process object must have the
- If
UseShellExecute = true
andRedirectStandardOutput = false
I get:- The system cannot find the file specified
- If
useShellExecute = false
andRedirectStandardOutput = true
I get:- The system cannot find the file specified
- If
UseShellExecute = false
andRedirectStandardOutput = 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_Conv开发者_运维百科erted + "\\" + strOutputFileName;
p.Start();
p.WaitForExit();
p.Close();
p.Dispose();
Can someone help me get around this issue, please?
When UseShellExecute
is false
the WorkingDirectory
property changes its meaning!
It becomes the working directory for the new process NOT the path to the executable. You need to specify the full path to the executable in the FileName
property instead.
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");
}
I'm no expert using the process API but it looks like you are placing command line arguments into the FileName. Try using Arguments for the command line arguments. And put the full path to the exe in the FileName.
Also using an @ in front of the string gets rid of the need for the doubling of backslashes.
p.StartInfo.FileName = @"C:\Program Files (x86)\VeryPDF PDF Split-Merge\pdfpg.exe"
精彩评论