2012-04-27 4 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. Вы будете запускать 32-битный процесс на 64-битной машине. Это означает, что C:\Windows\system32 прозрачно перенаправляется на C:\Windows\SysWOW64, и я ожидаю, что du.exe не может быть найден там. Если вы используете C:\Windows\Sysnative, вместо этого вы сможете найти файл.

Однако, я подозреваю, что вы добавили du.exe в системный каталог, так как это не стандартный компонент Windows. Вы не должны этого делать. Я рекомендую вам поместить файл в другое место, потому что вы просто не должны писать в системный каталог.

+0

Я понял это между отправкой вопроса и вашим ответом. du.exe - это 32-битный исполняемый файл, и он был неправильно помещен в system32 вместо SysWow64. Итак, когда 32-разрядная программа пошла на поиски, она не заметила этого, потому что файл du.exe оказался не в том месте. – whatsisname

+1

Но вы не должны помещать его в системный каталог вообще. Это зарезервировано для системы. Я уверен, что вы можете найти лучшее место для своего набора инструментов unix. –

+0

Это на самом деле SysInternals du. Я согласен, что этого не должно быть, но его там на нескольких машинах, так что теперь мне приходится с этим справляться. – whatsisname