2016-12-08 4 views
-2

Я использую двоичные файлы инструмента в проекте C# под названием GraphViz. Проблема заключается в том, что я должен указать путь двоичных файлов как жестко закодированный, и я не хочу этого делать.Mimic Linux, какая команда в C#

IRenderer renderer = new Renderer("C:\\Program Files (x86)\\Graphviz2.38\\bin"); // todo: remove hardcoded GraphViz path 

Я хочу, чтобы имитировать в Linux which команду. Просто передайте двоичное имя (например, dot) и получите путь.

GetBinaryPath("dot"); // return the above path 

Я бы по достоинству оценил любые идеи или темы для того, чтобы начать поиск.

Примечание Target OS: Windows
.NET версии: 4

+0

почему бы не использовать флаг? или пункт меню? или переменную окружения, чтобы указать, где установлена ​​программа, или просто убедиться, что двоичный файл находится в вашей переменной PATH и использовать exec без указания каталога (что является тем, что «делает») –

+0

2 голоса, чтобы закрыть вопрос, t понять, как это не связано с программированием. –

+2

является частью 'Graphviz2.38'? если это так, вы можете получить 'C: \\ Program Files (x86)' через 'Enviorment.GetFolderPath (Environment.SpecialFolder.ProgramFilesX86);' –

ответ

2

Если вам нужно найти путь дается только имя исполняемого файла (и каталог установки в переменной окружения PATH)

Вариант 1:

Использование команды where с классом Process. (Тест для выхода кода, разобрать выход)

Вариант 2:

Вы можете получить переменную окружения PATH среды, разделить его на ';' и проверить существование вашего исполняемого имени.

0

Прежде всего вам нужно найти все каталоги, в которых окна ищут exectuable файл, а также переменную среды% PATH%. Затем вам нужно найти все расширения (.com, .exe, .bat и т. Д.) Из% PATHEXT%.

Тогда вы просто проверить их, как это:

internal class Program { 
    private static void Main(string[] args) { 
     if (args.Length != 1) { 
      Console.WriteLine("Incorrect usage!"); 
      return; 
     } 

     var extensions = GetExecutableExtensions(args[0]); 
     var paths = GetPaths(); 

     var exeFile = GetFirstExecutableFile(args[0], extensions, paths); 
     if (exeFile == null) { 
      Console.WriteLine("No file found!"); 
     } 
     else { 
      Console.WriteLine(exeFile); 
     } 
    } 

    private static string GetFirstExecutableFile(string file, string[] extensions, string[] paths) { 
     foreach (var path in paths) { 
      var filename = Path.Combine(path, file); 
      if (extensions.Length == 0) { 
       if (File.Exists(filename)) { 
        return filename; 
       } 
      } 
      else { 
       foreach (var ext in extensions) { 
        filename = Path.Combine(path, file + ext); 
        if (File.Exists(filename)) { 
         return filename; 
        } 
       } 
      } 
     } 
     return null; 
    } 

    private static string[] GetExecutableExtensions(string file) { 
     var data = GetCmdOutput("echo %PATHEXT%"); 
     var arr = data.TrimEnd('\n', '\r').Split(new [] {';'}, StringSplitOptions.RemoveEmptyEntries); 

     //If the command passed in ends with a executable extension then we dont need to test all extensions so set it to emtpy array 
     foreach (var ext in arr) { 
      if (file.EndsWith(ext, StringComparison.OrdinalIgnoreCase)) { 
       return new string[0]; 
      } 
     } 

     return arr; 
    } 

    private static string[] GetPaths() { 
     var data = GetCmdOutput("echo %PATH%"); 
     return data.TrimEnd('\n', '\r').Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); 
    } 

    private static string GetCmdOutput(string cmd) { 
     using (var proc = new Process { 
      StartInfo = new ProcessStartInfo { 
       FileName = "cmd.exe", 
       Arguments = "/c " + cmd, 
       UseShellExecute = false, 
       RedirectStandardOutput = true, 
       CreateNoWindow = true 
      } 
     }) { 
      proc.Start(); 
      return proc.StandardOutput.ReadToEnd(); 
     } 
    } 
} 
+0

Только что заметил команду «где» в ответ от Скомалека. Гораздо лучшее решение. Ну, по крайней мере, вы знаете, как это работает из моего кода ... – MrApnea

Смежные вопросы