2010-02-11 5 views
1

J'utilise un outil logiciel tiers (outil de ligne de commande) pour fusionner des fichiers PDF ensemble. À l'aide de C#, j'essaie d'utiliser System.Diagnostics.Process pour exécuter l'exécutable, mais je viens avec quelques erreurs en fonction de la configuration des paramètres.Problème System.Diagnostics.Process avec WorkingDirectory

  • Si UseShellExecute = true et RedirectStandardOutput = true j'obtenir:
    • L'objet processus doit avoir l'ensemble de la propriété UseShellExecute false afin de rediriger les flux IO.
  • Si UseShellExecute = true et RedirectStandardOutput = false je reçois:
    • Le système ne peut pas trouver le fichier spécifié
  • Si UseShellExecute = false et RedirectStandardOutput = true je reçois:
    • Le système ne trouve pas le fichier spécifié
  • Si UseShellExecute = false et RedirectStandardOutput = false je reçois:
    • Le système ne peut pas trouver le fichier spécifié

Le code qui est en cours d'exécution est le suivant:

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

Quelqu'un peut-il m'aider à contourner ce problème s'il vous plaît

Répondre

2

Arguments ne doivent pas être passés dans la propriété FileName. Vous devez utiliser la propriété Arguments pour cela:

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

où la fonction GetProgramFilesX86 est peut être définie comme ceci:

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

Cette suggestion fusionné avec Kevin Gales "@" suggestion a bien fonctionné. Merci les gars d'aider. – mattgcon

6

Lorsque UseShellE xecute est faux la propriété WorkingDirectory change de sens! il devient le répertoire de travail pour le nouveau processus PAS le chemin vers l'exécutable. Vous devez spécifier le chemin d'accès complet à l'exécutable dans la propriété FileName à la place.

+0

voir Eh bien, je d'abord essayé votre suggestion, mais j'étais recieving le « Le système ne peut pas trouver le fichier spécifié "erreur. Voici ce que j'avais à l'origine: p.StartInfo.FileName = "C: \\ Program Files (x86) \\ Fichier PDF VeryPDF Split-Merge v3.0 \\ pdfpg.exe" + strFileNames.Trim() + "" + D2P_Folder_Converted + "\\" + strOutputFileName; – mattgcon

+0

Voir le commentaire de Kevin - vous devez placer les arguments dans l'exécutable de la propriété Arguments. Référence pour le problème UseShellExecute est ici: http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.useshellexecute.aspx –

+0

Merci James, je luttais sur ce ..... stupide d'eux pour changer la signification de WorkingDirectory lorsque UseShellExecute est désactivé! – Dal

0

Je ne suis aucun expert en utilisant l'API de processus, mais il semble que vous placez des arguments de ligne de commande dans le nom de fichier. Essayez d'utiliser Arguments pour les arguments de ligne de commande. Et mettre le chemin complet de l'exe dans le FileName.

L'utilisation d'un @ en avant de la chaîne élimine le besoin de doubler les antislashs.

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