Подтвердить что ты не робот

Как я могу найти домашний каталог пользователя в кросс-платформенной манере, используя С++?

Как я могу найти домашний каталог пользователя в кросс-платформенной форме на С++? например, /home/user в Linux, C:\Users\user\в Windows Vista, C:\Documents and Settings\user\в Windows XP и что бы то ни было, что Mac используют. (Я думаю, что он/Пользователь/пользователь)

В принципе, то, что я ищу, - это способ С++ сделать это (пример в python)

os.path.expanduser("~")
4b9b3361

Ответ 1

Я не думаю, что можно полностью скрыть разделение Windows/Unix с этим (если, возможно, Boost не имеет чего-то).

Самый переносимый способ должен быть getenv("HOME") в Unix и конкатенация результатов getenv("HOMEDRIVE") и getenv("HOMEPATH") в Windows.

Ответ 2

Это возможно, и лучший способ найти его - изучить исходный код os.path.expanduser("~"), очень просто реплицировать те же функции в C.

Вам нужно будет добавить несколько директив #ifdef для покрытия различных систем.

Вот правила, которые предоставят вам каталог HOME

  • Windows: env USERPROFILE, или если это не удается, соедините HOMEDRIVE + HOMEPATH
  • Linux, Unix и OS X: env HOME, или если это не удается, используйте getpwuid() (пример кода)

Важное замечание: многие полагают, что переменная среды HOME всегда доступна в Unix, но это не так.. Одним хорошим примером может быть OS X.

В OS X при запуске приложения из графического интерфейса (не консоль) это не будет иметь эту переменную, поэтому вам нужно использовать getpwuid().

Ответ 3

Домашний каталог на самом деле не является кросс-платформенной концепцией. Ваше предположение о корне каталога профиля (% USERPROFILE%) является справедливой аналогией, но в зависимости от того, что вы хотите сделать, когда у вас есть каталог, вам может понадобиться один из каталогов данных приложения или пользовательские Мои документы. В UNIX вы можете создать скрытый ".myapp" в домашнем каталоге, чтобы сохранить ваши файлы, но это не так в Windows.

Лучше всего написать конкретный код для каждой платформы, чтобы попасть в нужный каталог в каждом случае. В зависимости от того, насколько правильным вы хотите быть, может быть достаточно использовать env vars: HOME в UNIX, USERPROFILE или APPDATA (в зависимости от того, что вам нужно) в Windows.

В UNIX, по крайней мере (любые люди Windows хотят комментировать?), обычно рекомендуется использовать переменную среды HOME, если она установлена, даже если она не согласуется с каталогом, указанным в файле пароля. Затем, когда странный случай, когда пользователи хотят, чтобы все приложения считывали свои данные из другого каталога, он все равно будет работать.