2010-10-20 21 views
1

J'utilise un ProcessStartInfo patcher un fichier avec un fichier texte comme celui-ci (par cmd.exe):C# Problème avec ProcessStartInfo

temp.txt app.exe patch.ips

J'ai écrit ce code :

ProcessStartInfo P = new ProcessStartInfo("app.exe"); 
P.Arguments = "temp.txt " + _patchpath; 
P.CreateNoWindow = true; 
P.UseShellExecute = false; 
P.RedirectStandardOutput = true; 
Process.Start(P); 

app.exe et temp.txt sont liés à mon chemin d'application (note: app.exe est pas le nom de mon application C#, il est juste un programme que je utilise pour le processus), mais _patchpath est un chemin absolu comme D: \ blah \ file.ips. Le problème est, le processus ne fonctionne pas (_patchpath est censé être patché avec le fichier temp.txt) si son absolu, mais fonctionne si elle est relative à mon répertoire app. Pourquoi est-ce et comment puis-je le réparer?

Si j'ai besoin d'être clair s'il vous plaît faites le moi savoir.

+2

Peut-patcher chemin contient des espaces? Si c'est le cas, vous devrez l'encadrer entre guillemets. –

+0

Qu'est-ce qui ne fonctionne pas exactement? –

+0

Pouvez-vous fournir un vrai chemin? Je suppose que vous avez un chemin avec des espaces, et dans ce cas, vous devez entourer votre chemin avec des guillemets (") – Onkelborg

Répondre

1

Le problème est très probablement que l'application appelée (app.exe) ne comprend pas les paramètres. La meilleure façon de résoudre ce problème consiste à déboguer app.exe avec les paramètres que vous fournissez dans le cas où cela ne fonctionne pas. Essayez de définir les arguments dans le débogueur pour app.exe avec exactement les mêmes paramètres que le cas ayant échoué, et inspectez les variables résultant de l'analyse des arguments.

3

L'approche habituelle pour déboguer des problèmes de ce type consiste à utiliser le débogueur. Copier/coller dans la méthode principale() du fichier source pour « app.exe »:

 System.Diagnostics.Debugger.Break(); 

Dès app.exe commence la course, vous obtenez une boîte de dialogue qui vous permet de choisir un débogueur. De là, vous ne devriez pas avoir beaucoup de mal à comprendre pourquoi cela ne fonctionne pas.

Si vous n'avez pas le code source pour app.exe, vous devrez y réfléchir. L'utilisation d'un chemin relatif comme "app.exe" ou "temp.txt" est toujours un problème. Un mode de défaillance classique utilise un OpenFileDialog pour laisser l'utilisateur choisir la valeur _patchpath. Si la propriété RestoreDirectory de cette boîte de dialogue n'est pas définie sur True, le répertoire par défaut de votre programme se transforme en chemin d'accès au fichier de correctif. Et ni app.exe ni temp.txt ne peuvent être plus quatrièmes.

Protégez-vous contre cela en programmation défensive:

 var myPath = System.Reflection.Assembly.GetEntryAssembly().Location; 
     var homeDir = System.IO.Path.GetDirectoryName(myPath); 
     var appPath = System.IO.Path.Combine(homeDir, "app.exe"); 
     var tempPath = System.IO.Path.Combine(homeDir, "temp.txt"); 
     ProcessStartInfo P = new ProcessStartInfo(appPath); 
     P.WorkingDirectory = homeDir; 
     P.Arguments = string.Format("\"{0}\" \"{1}\"", tempPath, _patchpath); 
     // etc... 
+0

D'accord, je vais tester l'application en utilisant le débogueur (bien qu'il soit écrit en C++ mais je suppose Je pourrais le déboguer en utilisant MSVC++.) Et merci pour l'information concernant le changement de répertoire par défaut du programme, je ne le savais pas .. – david

+1

C'est __debugbreak() dans MSVC. –