ホームディレクトリにフォルダを作成する方法は?
-
28-10-2019 - |
質問
ディレクトリを作成したいです 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")));