8

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

を使用してみましboost::filesystem::create_directory(path)たが、失敗します。この関数はシステム変数を展開しないようです。

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

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

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

4

2 に答える 2

18

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からコピーされます。Linuxで、、、が設定される可能性は低いですがUSERPROFILE、さまざまな環境変数を盲目的に試すのではなく、ターゲットプラットフォームをチェックすることで、プラットフォームにとらわれない試みを改善できます。HOMEDRIVEHOMEPATH

于 2011-02-03T20:09:15.497 に答える
4

頭のてっぺんから、

namespace fs = boost::filesystem;
fs::create_directory(fs::path(getenv("HOME")));
于 2011-02-04T22:50:19.880 に答える