2009-09-15 3 views
3

У меня есть исполняемое имя, например «cmd.exe», и вам нужно решить его полностью квалифицированный путь. Я знаю, что exe появляется в одном из каталогов, перечисленных в переменной среды PATH. Есть ли способ разрешить полный путь без разбора и тестирования каждого каталога в переменной PATH? в основном я не хочу этого делать:Как найти файл, который может быть недостаточно квалифицирован, используя путь к среде?

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

Должен быть лучший способ, не так ли?

ответ

2

Это похоже на довольно хороший способ сделать это уже - насколько я знаю, поиск по каталогам в переменной окружения PATH - это то, что Windows делает в любом случае, когда пытается решить путь.

0

Вы можете сделать это от command line using PowerShell. Если вы хотите начать процесс с C# и проанализировать его результат, вы можете использовать этот подход. Я не думаю, что это проще, чем то, что вы уже делаете.

4

Вот другой подход:

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().

3

Вы можете LinQ его

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

Чуть более читаемым, может быть?

Dan

+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; 
     } 
    }