2012-04-27 85 views
3

這讓我難以置信。使用下面的代碼:Process.Start():系統找不到指定的文件,但我的文件路徑似乎是合法的

Process du = new Process();   

string cmdPath = System.IO.Path.Combine(Environment.SystemDirectory, "du.exe"); 
Debug.WriteLine(cmdPath); 

ProcessStartInfo info = new ProcessStartInfo(cmdPath); 
info.CreateNoWindow = true; 

info.Arguments = arguments;    
info.UseShellExecute = false; 

info.RedirectStandardOutput = true; 
du.StartInfo = info; 
du.EnableRaisingEvents = true; 
du.OutputDataReceived += responseParser; 

du.Start(); 
du.BeginOutputReadLine(); 
du.WaitForExit(); 

我運行,我也得到:

未處理的異常:System.ComponentModel.Win32Exception:系統找不到指定的文件

雖然cmdPath的輸出值是C:\Windows\system32\du.exe

當然,如果我只是在命令提示符下鍵入cmdPath的內容,它會運行du.exe並給我使用信息。另外,如果我用「du.exe」替換命令路徑,並將du.exe放在工作目錄中,所有工作正常。但我想引用系統位置中的那個。

那麼,這是怎麼回事?據我所知,我有一個合法的文件說明符,但爲什麼不會Process.Start()執行它?這個基本的代碼也執行其他幾個程序並獲得它們的輸出。其他的都可以正常工作,但是du.exe和它們不同,因爲它在system32目錄中。這與它有什麼關係?

感謝

回答

14

這是下降到file system redirector。您將在64位機器上運行32位進程。這意味着C:\Windows\system32被透明地重定向到C:\Windows\SysWOW64,我預計在那裏找不到du.exe。如果您使用C:\Windows\Sysnative,那麼您將能夠找到該文件。

但是,我懷疑您已將du.exe添加到系統目錄,因爲這不是標準的Windows組件。你不應該那樣做。我建議你把文件放在其他地方,因爲你不應該寫在系統目錄中。

+0

我想出了問題和答案之間的關係。 du.exe是一個32位可執行文件,並不正確地放在system32而不是SysWow64中。所以,當32位程序去尋找它時,它沒有注意到它,因爲du.exe在錯誤的地方。 – whatsisname 2012-04-27 23:46:42

+1

但是你不應該把它放在系統目錄中。這是爲系統保留的。我相信你可以爲你的unix工具集找到一個更好的地方。 – 2012-04-27 23:47:28

+0

它實際上是SysInternals du。我同意它不應該在那裏,但它在幾臺機器上,所以現在我必須處理它。 – whatsisname 2012-04-27 23:52:46

相關問題