ディレクトリを作成したいpath = "$HOME/somedir"
。
を使用してみましboost::filesystem::create_directory(path)
たが、失敗します。この関数はシステム変数を展開しないようです。
どうすれば最も簡単な方法でそれを行うことができますか?
(注:私の場合、文字列path
は定数であり、変数が含まれているかどうかはわかりません)
編集:私はLinuxに取り組んでいます(ただし、近い将来、アプリをWindowsに移植する予定です)。
ディレクトリを作成したい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からコピーされます。Linuxで、、、が設定される可能性は低いですがUSERPROFILE
、さまざまな環境変数を盲目的に試すのではなく、ターゲットプラットフォームをチェックすることで、プラットフォームにとらわれない試みを改善できます。HOMEDRIVE
HOMEPATH
頭のてっぺんから、
namespace fs = boost::filesystem;
fs::create_directory(fs::path(getenv("HOME")));