2016-08-12 10 views
1

私はBoostライブラリを使ってC++プログラムを書いています。私は実行ファイルの完全なパスを見つけることができるようにする必要があります。これはUnixシェルのwhichユーティリティ、Windows 'where、またはPythonのshutil.whichユーティリティと同等です。

これを行う方法はありますか?私はもちろん、PATH環境変数を反復することで私自身も書くことができますが、移植性のためには、:;などで分割することを考慮する必要があります。私はそれを使用することを好むだろう。

+0

さて、最終的には、あなたがしているシェルの特性を考慮する必要があるでしょう。なぜなら、そのシェル* boggle * –

答えて

0

ブーストに直接実装するものは何もありません。あなたは、どちらかの可能性:

    getenv()PATH
  1. 読む内容は、ポータブルな方法でパスに対処し、手動でマルチパス分割を処理するためにBoost File Systemを使用 - スプリット文字の数は、可能性のように見えるしていません。
  2. invokeシェルの既存whichプログラム(またはその変異体)
  3. shutil.whichを呼び出す簡単なPythonプログラムを起動し、例えば非常識、わずか数の選択肢
  4. system("python -c \"import shutil; shutil.which('ls');\"")
+0

で提供されているツールを使用するだけで十分です。これは少し残念ですが、利用できるものは何もありませんが、あなたが言うように、それを自分で書くのは災害ではありません。私はこのアプリケーションをC++で書いているのはパフォーマンスと実装面積が小さいため、サブプロセスを呼び出すことでそれを殺すことになるので、他のプログラムに砲撃したくないからです(その時点で私はおそらくとにかくPython ...) –

+0

Mhm、OK。パフォーマンスのPOVからは、このタイプのものをC++で書くのは残酷かもしれません。また、少し生産的です。 'python'は、システムレベルのタスクIMHOの方がはるかに優れています。あなたの文脈はわかりませんが、おそらくプログラムの起動時にすべてのパス情報を読み込むことができます。どんな言語でもほとんど時間がかかりません。 –

0

これは通常どのように行われるかです。これはC++の豊富なstd::stringクラスのC言語の熊であったかもしれませんが、これは納得のいくものになります。ブーストも必要ありません。これは、入門C++のコースでの典型的な宿題のようになります。これは、このような非問題です

std::string s=getenv("PATH"); 

const char sep=':'; // Or use ';', if you feel like it. 

auto b=s.begin(), e=s.end(); 

while (b != e) 
{ 
    if (*b == sep) 
    { 
     ++b; 
     continue; 
    } 

    auto p=b; 
    b=std::find(b, e, sep); 

    auto check=std::string(p, b) + "/" + filename; 

    if (access(filename.c_str(), X_OK) == 0) 
    { 
      // Found it. Insert code here. 
    } 
} 

、それはおそらく、どこか、いくつかのライブラリ関数を見つけようとし、その後、これをノックアウトする速くていただろうそれは同じことをします。

+0

もちろん、このタイプのコードは、 check = std :: string(p、b)+ "/" +ファイル名; '(つまりハードコーディングされた'/')であり、あなた自身がそれを行うときにあなたが開いている間違いのタイプです。 OPはそれをやる方法を尋ねるのではなく、ポータブルな方法でそれをやり遂げる方法です。 –

+0

また、 'std :: string'は、少なくともWindowsでは、ファイルシステムが行う完全なUnicode文字セットをサポートしていません。ポータブル版では、変換のエンコードやwstringの使用が必要になります。基本的には、「私のための仕事」のコンテキストでは十分に単純ですが、多くのユーザーにとって必要なものではありません。 –

関連する問題