質問

ディレクトリを作成したいです path = "$HOME/somedir".

使ってみました boost::filesystem::create_directory(path), 、しかし失敗します - 明らかに関数はシステム変数を拡張しません。

どうすれば最も簡単な方法でそれを行うことができますか?

(注:私の場合、文字列 path 一定であり、変数が含まれているかどうかはわかりません)

編集:Linuxに取り組んでいます(近い将来、アプリをWindowsに移植する予定です)。

役に立ちましたか?

解決

使用する getenv を含む環境変数を取得するには HOME. 。それらが存在するかもしれないかどうかを確信していない場合は、それらを探している文字列を解析する必要があります。

また、システムシェルとエコーを使用して、シェルにこれを行わせることもできます。

GetENVはポータブル(標準Cから)ですが、シェルを使用してこれを実行することは、 *nixとWindowsの間でより困難になります。環境変数の規則は *nixとWindowsの間でも異なりますが、おそらく文字列は、指定されたプラットフォームで変更できる構成パラメーターです。

任意の環境変数ではなく、拡張ホームディレクトリのみをサポートする必要がある場合は、 ~ コンベンション、そして ~/somedir 構成文字列の場合:

std::string expand_user(std::string path) {
  if (not path.empty() and path[0] == '~') {
    assert(path.size() == 1 or path[1] == '/');  // or other error handling
    char const* home = getenv("HOME");
    if (home or ((home = getenv("USERPROFILE")))) {
      path.replace(0, 1, home);
    }
    else {
      char const *hdrive = getenv("HOMEDRIVE"),
        *hpath = getenv("HOMEPATH");
      assert(hdrive);  // or other error handling
      assert(hpath);
      path.replace(0, 1, std::string(hdrive) + hpath);
    }
  }
  return path;
}

この動作はPythonからコピーされます os.path.expanduser, 、現在のユーザーのみを処理することを除いて。プラットフォームの不可知論者であることの試みは、異なる環境変数を盲目的に試すのではなく、ターゲットプラットフォームをチェックすることで改善できます。 USERPROFILE, HOMEDRIVE, 、 と HOMEPATH Linuxに設定される可能性は低いです。

他のヒント

私の頭の上から、

namespace fs = boost::filesystem;
fs::create_directory(fs::path(getenv("HOME")));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top