환경 경로를 사용하여 완전히 자격을 얻지 못할 수있는 파일을 어떻게 찾습니까?

StackOverflow https://stackoverflow.com/questions/1429633

문제

"cmd.exe"와 같은 실행 가능 이름이 있으며 완전히 자격을 갖춘 경로를 해결해야합니다. 경로 환경 변수에 나열된 디렉토리 중 하나에 EXE가 나타납니다. 경로 변수에서 각 디렉토리를 구문 분석하고 테스트하지 않고 전체 경로를 해결하는 방법이 있습니까? 기본적으로 나는 이것을하고 싶지 않습니다.

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

더 나은 방법이 있어야합니까?

도움이 되었습니까?

해결책

이것은 내가 아는 한 이미 그것을하는 꽤 좋은 방법 인 것 같습니다. PATH 환경 변수는 경로를 해결하려고 할 때 Windows가하는 일입니다.

다른 팁

또 다른 접근법은 다음과 같습니다.

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

결과 : C : Windows System32

Path.comBine () 호출은 후행 슬래시로 끝나지 않는 경로를 처리하는 데 사용됩니다. 이것은 file.exists () 메소드에서 사용할 문자열을 올바르게 연결합니다.

당신은 그것을 linq 할 수 있습니다

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

조금 더 읽기 쉬운가요?

글쎄, 나는 다음을 발견했다. 그러나 나는 관리 된 구현을 고수 할 것이라고 생각합니다.

    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;
        }
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top