2009-09-15 2 views
3

나는 "cmd.exe"와 같은 실행 가능한 이름을 가지고 있으며 완전한 경로를 해결해야합니다. exe가 PATH 환경 변수에 나열된 디렉토리 중 하나에 나타나는 것을 압니다. 구문 분석 및 PATH 변수의 각 디렉토리를 테스트하지 않고 전체 경로를 해결할 수있는 방법이 있습니까? 기본적으로 저는 이것을 원하지 않습니다 :환경 경로를 사용하여 정규화되지 않은 파일을 찾으려면 어떻게합니까?

foreach (string entry in Environment.GetEnvironmentVariable("PATH").Split(';')) 
    ... 

더 좋은 방법이 있어야합니다, 맞습니까?

답변

2

이것은 내가 이미 알고있는 한, PATH 환경 변수의 디렉토리를 검색하는 것은 경로를 확인하려고 할 때 Windows가 수행하는 작업입니다.

string exe = "cmd.exe"; 
string result = Environment.GetEnvironmentVariable("PATH") 
    .Split(';') 
    .Where(s => File.Exists(Path.Combine(s, exe))) 
    .FirstOrDefault(); 

결과 : C : Path.Combine() 호출이 슬래시로 끝나지 않는 경로를 처리하는 데 사용됩니다

\ WINDOWS \ system32를

0

command line using PowerShell에서이 작업을 수행 할 수 있습니다. C#에서 프로세스를 시작하고 결과를 파싱하려면이 방법을 사용할 수 있습니다. 나는 당신이 이미하고있는 것보다 더 간단하다고 생각하지 않습니다.

4

는 여기에 또 다른 접근 방식이다. 이렇게하면 File.Exists() 메서드에서 사용할 문자열을 올바르게 연결합니다.

3

당신은 어쩌면 조금 더 읽을 수

string path = Environment 
       .GetEnvironmentVariable("PATH") 
       .Split(';') 
       .FirstOrDefault(p => File.Exists(p + filename)); 

함께 LINQ 수 있을까?

+0

File.Exists를 호출하기 전에 경로를 올바르게 작성해야한다고 생각합니다. File.Exists (Path.Combine (p, filename)) –

1

글쎄, 나는 다음을 발견했다. 그러나 관리되는 구현에 집중할 것입니다.

static class Win32 
    { 
     [DllImport("shlwapi.dll", CharSet = CharSet.Auto, SetLastError = false)] 
     static extern bool PathFindOnPath([MarshalAs(UnmanagedType.LPTStr)] StringBuilder pszFile, IntPtr unused); 

     public static bool FindInPath(String pszFile, out String fullPath) 
     { 
      const int MAX_PATH = 260; 
      StringBuilder sb = new StringBuilder(pszFile, MAX_PATH); 
      bool found = PathFindOnPath(sb, IntPtr.Zero); 
      fullPath = found ? sb.ToString() : null; 
      return found; 
     } 
    }