2012-04-27 3 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 디렉토리에 있다는 점에서 du.exe가 다르지만 다른 모든 것은 정상적으로 작동합니다. 그것은 그것과 관련이 있습니까?

감사

답변

14

이 아래로 file system redirector이다. 64 비트 시스템에서 32 비트 프로세스를 실행하게됩니다. 즉, C:\Windows\system32C:\Windows\SysWOW64으로 투명하게 리디렉션되며 그 곳에서 du.exe을 찾을 수 없습니다. 대신 C:\Windows\Sysnative을 사용하면 파일을 찾을 수 있습니다.

그러나 표준 Windows 구성 요소가 아니기 때문에 du.exe을 시스템 디렉터리에 추가 한 것으로 의심됩니다. 너는 그렇게해서는 안된다. 나는 단순히 시스템 디렉토리에 쓰면 안되기 때문에 파일을 다른 곳에 두는 것을 권장한다.

+0

나는 질문과 당신의 대답을 게시하는 사이에 그것을 알아 냈다. du.exe는 32 비트 실행 파일이며 SysWow64 대신 system32에 부적절하게 넣었습니다. 그래서, 32 비트 프로그램이 그것을 찾았을 때, du.exe가 잘못된 위치에 있었기 때문에 그것을 알아 채지 못했습니다. – whatsisname

+1

하지만 시스템 디렉토리에이 파일을 두어서는 안됩니다. 시스템에 예약되어 있습니다. 유닉스 툴셋에서 더 나은 곳을 찾을 수있을 것이라고 확신한다. –

+0

실제로 SysInternals du입니다. 나는 그것이 거기에 있지 않아야한다고 동의하지만 여러 대의 기계에 있어야한다. 그래서 나는 그것을 다루어야한다. – whatsisname

관련 문제