Как я могу найти корневой каталог пользователя кросс-платформенным способом в C++? т.е./home/user в Linux, C:\Users\user\ на Windows Vista, C:\Documents And Settings\user\ на Windows XP, и независимо от того, что это - то использование Mac. (Я думаю, что это-/User/user),
В основном то, что я ищу, является C++ способ сделать это (пример в Python)
os.path.expanduser("~")
Я не думаю, что с помощью этого можно полностью скрыть разделение Windows / Unix (если, может быть, в Boost что-то есть).
Наиболее переносимым способом будет getenv ("HOME")
в Unix и объединение результатов 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
Домашний каталог на самом деле не является кроссплатформенной концепцией. Ваше предложение корня каталога профиля (%USERPROFILE%)Это справедливая аналогия, но в зависимости от того, что вы хотите сделать после получения каталога, вам может потребоваться один из каталогов данных приложения или мои документы пользователя. В UNIX вы можете создать скрытый ".myapp" в домашнем каталоге, чтобы сохранить свои файлы, но это не так в Windows.
Лучше всего написать конкретный код для каждой платформы, чтобы попасть в каталог, который вы хотите в каждом случае. В зависимости от того, насколько правильным вы хотите быть, может быть достаточно использовать env vars: HOME на UNIX, USERPROFILE или APPDATA (в зависимости от того, что вам нужно) на Windows.
По крайней мере, в UNIX (кто-нибудь из пользователей Windows хочет прокомментировать?), обычно рекомендуется использовать переменную среды HOME, если она установлена, даже если она не согласуется с каталогом, указанным в файле паролей. Затем, в странном случае, когда пользователи хотят, чтобы все приложения считывали их данные из другого каталога, это все равно будет работать.