2016-12-08 5 views
-2

GraphVizというC#プロジェクトでツールのバイナリを使用しています。 問題は、バイナリパスをハードコード化して含める必要があり、そうしたくないということです。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 

検索を開始するためのアイデアやトピックがありがとうございます。

注 対象OS:Windowsの
.NETバージョン:4

+0

なぜフラグを使用しない:

次に、あなただけの、このようにそれらをチェック!メニュー項目ですか?プログラムがどこにインストールされているかを指定したり、バイナリがあなたのPATH変数にあることを確認したり、ディレクトリを指定せずにexecを使用したりするための環境変数を指定します(これは 'which'がします)。 –

+0

質問を閉じる2票、これがどのようにプログラミングに関連していないかを理解していない。 –

+2

は 'Graphviz2.38'部分が修正されていますか? 'Enviorment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);' –

答えて

2

あなたが唯一の実行可能ファイル名(およびインストールディレクトリは、あなたのPATH環境変数である)指定されたパスを見つける必要がある場合は

オプション1:

whereコマンドをProcessクラスに使用します。 (終了コードのためのテスト、出力を解析)

オプション2:あなたは、環境のPATH環境変数を取得することができます

は、ことによってそれを分割します ';'実行可能ファイル名の存在をテストします。

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