31

C ++でクロスプラットフォームの方法でユーザーのホームディレクトリを見つけるにはどうすればよいですか?つまり、Linuxの/ home / user、Windows VistaのC:\ Users \ user \、Windows XPのC:\ Documents And Settings \ user \、およびMacが使用するものは何でも。(私はそれが/ User / userだと思います)

基本的に、私が探しているのは、これを行うC ++の方法です(Pythonの例)

os.path.expanduser("~")
4

3 に答える 3

29

これでWindows/Unixの分割を完全に隠すことはできないと思います(おそらく、Boostに何かがない限り)。

最も移植性の高い方法はgetenv("HOME")、Unixで、Windowsの結果getenv("HOMEDRIVE")getenv("HOMEPATH")Windowsの結果を連結することです。

const static volatile char A = 'a'; // All this is to prevent reverse engineering
#ifdef unix
    HomeDirectory = getenv((char[]){A-25, A-18, A-20, A-28, 0});
#elif defined(_WIN32)
    HomeDirectory = getenv((char[]){A-25, A-18, A-20, A-28, A-29, A-15, A-24, A-11, A-28, 0});
    const char*Homepath = getenv((char[]){A-25, A-18, A-20, A-28, A-17, A-32, A-13, A-25, 0});
    HomeDirectory = malloc(strlen(HomeDirectory)+strlen(Homepath)+1);
    strcat(HomeDirectory, Homepath);
#endif
于 2010-03-31T11:29:41.920 に答える
21

これは可能であり、それを見つける最良の方法はのソースコードを調べることですos.path.expanduser("~")。Cで同じ機能を複製するのは本当に簡単です。

#ifdefさまざまなシステムをカバーするために、いくつかのディレクティブを追加する必要があります。

これがあなたにHOMEディレクトリを提供する規則です

  • Windows:envUSERPROFILEまたはこれが失敗した場合は、連結HOMEDRIVE+HOMEPATH
  • Linux、Unix、OS X:env HOME、またはこれが失敗した場合は、getpwuid()サンプルコード)を使用します

重要な注意:多くの人は、HOME環境変数は常にUnixで利用可能であると想定していますが、これは真実ではありません。1つの良い例はOSXです。

OS Xでは、GUI(コンソールではなく)からアプリケーションを実行すると、この変数が設定されないため、getpwuid()を使用する必要があります。

于 2010-09-17T09:02:30.783 に答える
2

ホームディレクトリは、実際にはクロスプラットフォームの概念ではありません。プロファイルディレクトリのルート(%USERPROFILE%)の提案はかなり類似していますが、ディレクトリを取得した後で何をしたいかによっては、アプリケーションデータディレクトリの1つ、またはユーザーのマイドキュメントが必要になる場合があります。UNIXでは、ホームディレクトリに非表示の「.myapp」を作成してファイルを保持することができますが、Windowsでは正しくありません。

最善の策は、プラットフォームごとに特定のコードを記述して、それぞれの場合に必要なディレクトリに到達することです。どれだけ正確になりたいかによっては、環境変数を使用するだけで十分な場合があります。UNIXの場合はHOME、Windowsの場合はUSERPROFILEまたはAPPDATA(必要なものに応じて)です。

少なくともUNIXでは(Windowsの人はコメントしたいですか?)、パスワードファイルで特定されたディレクトリと一致しない場合でも、設定されている場合は通常、HOME環境変数を使用することをお勧めします。次に、ユーザーがすべてのアプリに別のディレクトリからデータを読み取らせたいという奇妙な場合でも、それは機能します。

于 2010-03-31T12:39:05.747 に答える