views:

329

answers:

2

Possible Duplicate:
how to find the location of the executable in C

Hi,

I am looking for a portable way to find the root directory of a program (in C++). For instance, under Linux, a user could copy code to /opt, add it to the PATH, then execute it:

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

(where "execute_my_special_code" is the program in /opt/my_special_code).

Now, as a developer of "execution_of_my_special_code", is there a portable programmatical way of finding out that the executable is in /opt/my_special_code?

A second example is on MS Windows: What if my current working directory is on one hard drive (e.g. "C:\") and the executable is placed on another (e.g. "D:\")?

Ultimately, the goal is to read some predefined configuration files that are packaged with the program code without forcing the user to enter the installation directory.

Thanks a lot in advance!

+6  A: 

There is no portable way of doing this. Neither the C nor C++ standard require the argv array to hold this information and there are no library routines in the standard libraries that provide it.

You will need to find a non-portable way of obtaining this information in a platform-specific way, such as GetModuleFileName under Windows or reading /proc/self/exe under Linux.

In any case, it's actually a bad idea to store configuration information with the executable since that means it's the same for all users. The UNIX way of doing this is to store program-specific information in the /etc tree and user-specific info in the user's home directory. For example, for your application called dodgybob, the user's configuration file could be called $HOME/.dodgybob or $HOME/.dodgybobrc.

For Windows, you should be storing program-specific information in the registry (HKLM) and user-specific information either in the registry (HKCU) or in the user's own areas (e.g., Documents & Settings\<username>\Local Settings although the right way to do that is with SHGetSpecialFolderPath passing CSIDL_APPDATA or (Vista and later) with known folder IDs, though the old method still works on Vista as a stub function).

paxdiablo
Perhaps AppData would be better?
batbrat
sbi
I fully agree that it is a bad idea to dictate the users their configuration. On the other hand, I'd intent to present them predefined values outside of the compiled source code (these values can be overwritten by individual configurations, of course).Thanks for all the answers!
Bullet Tooth Tony
+1  A: 

There is no ISO c++ code for this but you could do a conditional compiling and use _getcwd (Windows) or 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;
}

Since you want to do cross-platform-programming you should store your settings/configurations in a xml file. This way you don't have to create two parser (one for the registry and another one for a linux solution) and you don't have to deal with different windows versions!

Layne
Nope - working dir is not installation dir.
MSalters