2

重複の可能性:
Cで実行可能ファイルの場所を見つける方法

やあ、

プログラムのルートディレクトリ(C ++)を見つけるための移植可能な方法を探しています。たとえば、Linuxでは、ユーザーはコードを/ optにコピーし、それをPATHに追加してから、次のように実行できます。

cp -r my_special_code /opt/
export PATH=${PATH}:/opt/my_special_code/
cd /home/tony/
execution_of_my_special_code

(ここで、「execute_my_special_code」は/ opt / my_special_code内のプログラムです)。

さて、「execution_of_my_special_code」の開発者として、実行可能ファイルが/ opt / my_special_codeにあることをプログラムで確認するための移植可能な方法はありますか?

2番目の例はMSWindowsの場合です。現在の作業ディレクトリが1つのハードドライブ(「C:\」など)にあり、実行可能ファイルが別のハードドライブ(「D:\」など)にある場合はどうなりますか?

最終的には、ユーザーにインストールディレクトリへのアクセスを強制することなく、プログラムコードとともにパッケージ化された事前定義された構成ファイルを読み取ることが目標です。

よろしくお願いします!

4

2 に答える 2

8

これを行う移植可能な方法はありません。C 標準も C++ 標準も、argvこの情報を保持するために配列を必要とせず、標準ライブラリにはそれを提供するライブラリ ルーチンはありません。

GetModuleFileNameWindows や/proc/self/exeLinux での読み取りなど、プラットフォーム固有の方法でこの情報を取得する移植性のない方法を見つける必要があります。

いずれにせよ、構成情報を実行可能ファイルに保存することは、実際には悪い考えです。これは、すべてのユーザーにとって同じであることを意味するためです。これを行う UNIX の方法は、プログラム固有の情報を/etcツリーに格納し、ユーザー固有の情報をユーザーのホーム ディレクトリに格納することです。たとえば、 という名前のアプリケーションdodgybobの場合、ユーザーの構成ファイルは$HOME/.dodgybobまたはと呼ばれる可能性があります$HOME/.dodgybobrc

Windows の場合、プログラム固有の情報をレジストリ (HKLM) に格納し、ユーザー固有の情報をレジストリ ( HKCU ) またはユーザー自身の領域に格納する必要があります (たとえば、Documents & Settings\<username>\Local Settingsこれを行う正しい方法は、または ( Vista 以降) 既知のフォルダー ID を使用しますが、古い方法はまだ Vista でスタブ関数として機能します)。SHGetSpecialFolderPathCSIDL_APPDATA

于 2010-02-20T11:26:00.230 に答える
1

このための ISO c++ コードはありませんが、条件付きコンパイルを実行して _getcwd (Windows) または getcwd (Linux) を使用できます。

#define GetCurrentDir _getcwd
std::string SettingsHandler::getFullPath() {
    char chPath[2048];

    if (!GetCurrentDir(chPath, sizeof(chPath))) {
        return "ERROR";
    }

    chPath[sizeof(chPath) - 1] = '/0';

    return chPath;
}

クロスプラットフォーム プログラミングを行いたいので、設定/構成を xml ファイルに保存する必要があります。この方法では、2 つのパーサー (レジストリー用と Linux ソリューション用) を作成する必要がなく、異なる Windows バージョンに対処する必要もありません。

于 2010-02-20T12:35:25.270 に答える