2010-10-20 48 views
1

我使用的ProcessStartInfo修補文件有這樣一個文本文件(通過CMD.EXE):用的ProcessStartInfo C#問題

APP.EXE TEMP.TXT patch.ips

我寫了這個代碼:

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和TEMP.TXT是相對於我的應用程序路徑(注:APP.EXE是不是我的C#應用​​程序的名稱,它只是我使用過程中的程序),但_patchpath是像D:\ blah \ file.ips這樣的絕對路徑。問題是,該進程不起作用(_patchpath應該用文件temp.txt修補),如果它是絕對的,但如果它相對於我的應用程序目錄起作用,則工作。爲什麼是這樣的,我該如何解決它?

如果我需要清楚,請讓我知道。

+2

能修補路徑包含空格?如果是這樣,你需要把它放在引號中。 – 2010-10-20 09:38:46

+0

什麼不工作? – 2010-10-20 09:39:12

+0

你能提供一個真正的路徑嗎?我懷疑你有一個空間的路徑,在這種情況下,你必須用引號括住你的路徑(「) – Onkelborg 2010-10-20 09:39:21

回答

1

問題很可能是被調用的應用程序(app.exe)不理解參數。解決此問題的最佳方法是使用在不起作用的情況下提供的參數來調試app.exe。嘗試將app.exe的調試器中的參數設置爲與失敗案例完全相同的參數,然後檢查解析參數後得到的變量。

3

像這樣調試問題的常用方法是使用調試器。一旦

 System.Diagnostics.Debugger.Break(); 

爲APP.EXE開始運行時,你會得到一個對話框,讓你選擇一個調試器:複製/粘貼成「APP.EXE」源文件的Main()方法。從那裏你不應該很難找出爲什麼它不起作用。

如果您沒有app.exe的源代碼,那麼您需要仔細考慮。使用像「app.exe」或「temp.txt」這樣的相對路徑總是麻煩。經典失敗模式是使用OpenFileDialog來讓用戶選擇_patchpath值。如果該對話框的RestoreDirectory屬性未設置爲True,則程序的默認目錄將變爲修補程序文件的路徑。而且app.exe和temp.txt都不能再四分之一了。

通過防守編程,保護自己不受此:

 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

好的,我將使用調試器測試應用程序(雖然它是用C++編寫的,但我假設我可以使用MSVC++進行調試)並感謝有關程序的默認目錄更改的信息,我不知道.. – david 2010-10-21 12:27:59

+1

它是MSVC中的__debugbreak()。 – 2010-10-21 13:07:18