Как я могу найти домашний каталог пользователя в кросс-платформенной манере, используя С++?
Как я могу найти домашний каталог пользователя в кросс-платформенной форме на С++? например, /home/user в Linux, C:\Users\user\в Windows Vista, C:\Documents and Settings\user\в Windows XP и что бы то ни было, что Mac используют. (Я думаю, что он/Пользователь/пользователь)
В принципе, то, что я ищу, - это способ С++ сделать это (пример в python)
os.path.expanduser("~")
Ответы
Ответ 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, если она установлена, даже если она не согласуется с каталогом, указанным в файле пароля. Затем, когда странный случай, когда пользователи хотят, чтобы все приложения считывали свои данные из другого каталога, он все равно будет работать.