2016-12-08 1 views
-2

GraphViz이라는 C# 프로젝트에서 도구의 바이너리를 사용합니다. 문제는 바이너리 경로를 하드 코딩 된 경로로 포함해야하며이를 원하지 않는다는 것입니다.C#에서 명령어를 사용하는 Mimic Linux

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

나는 리눅스 which 명령을 모방하고 싶다. 이진 이름 (예 : dot)을 전달하고 경로를 가져옵니다.

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

검색을 시작하기위한 아이디어 나 주제가 있으면 고맙겠습니다.

주 대상 OS : 윈도우
.NET 버전 : 4

+0

은 왜 플래그를 사용합니까? 또는 메뉴 항목? 또는 프로그램이 설치되어있는 곳을 지정하기위한 환경 변수 또는 바이너리가 PATH 변수에 있는지 확인하고 디렉토리를 지정하지 않고 exec를 사용하십시오 (which which는 무엇을합니다). –

+0

질문 2를 닫으면, 이것은 프로그래밍과 관련이없는 방법을 이해합니다. –

+2

은'Graphviz2.38' 부분이 수정 되었습니까? 그렇다면 Enviorment.GetFolderPath (Environment.SpecialFolder.ProgramFilesX86); –

답변

2

당신이 경로는 실행 파일 이름을 지정 (및 설치 디렉토리가 PATH 환경 변수에) 발견해야하는 경우

옵션 1 :

where 명령을 Process 클래스와 함께 사용하십시오. ';'

,하여 분할 당신은 환경 PATH 환경 변수를 얻을 수 있습니다 :

옵션 2 (종료 코드에 대한 테스트는 출력을 구문 분석) 실행 파일 이름 존재 여부를 테스트합니다.

0

먼저 windows가 실행 파일을 검색하고 환경 변수 % PATH %에서 검색하는 모든 디렉토리를 찾아야합니다. 그런 다음 % PATHEXT %에서 모든 확장자 (.com, .exe, .bat 등)를 찾아야합니다.

그럼 그냥 같이 그들을 확인 :

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

Skomialek의 답변에서 '어디서'명령을 발견했습니다. 훨씬 더 나은 해결책. 적어도 내 코드에서 어떻게 작동하는지 알 수 있습니다. – MrApnea

관련 문제