Как я могу найти домашний каталог пользователя в кросс-платформенном режиме, используя C ++? - PullRequest
27 голосов
/ 31 марта 2010

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

По сути, я ищу способ сделать это на C ++ (пример на python)

os.path.expanduser("~")

Ответы [ 3 ]

27 голосов
/ 31 марта 2010

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

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

17 голосов
/ 17 сентября 2010

Это возможно , и лучший способ найти его - изучить исходный код 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 ().

2 голосов
/ 31 марта 2010

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

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

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

...