Pergunta

Como posso encontrar o diretório inicial do usuário de maneira cruzada em C ++? IE /Home /Usuário em Linux, C: Users User no Windows Vista, C: Documentos e Configurações User no Windows XP e seja o que for que os Macs usem. (Acho que é /usuário /usuário)

Basicamente, o que estou procurando é uma maneira C ++ de fazer isso (exemplo em Python)

os.path.expanduser("~")
Foi útil?

Solução

Eu não acho que seja possível ocultar completamente o Windows/Unix Divide com este (a menos que, talvez, o Boost tenha algo).

A maneira mais portátil teria que ser getenv("HOME") no Unix e concatenando os resultados de getenv("HOMEDRIVE") e getenv("HOMEPATH") nas janelas.

Outras dicas

este é possível, e a melhor maneira de descobrir é estudar o código -fonte de os.path.expanduser("~"), é realmente fácil replicar a mesma funcionalidade em C.

Você terá que adicionar alguns #ifdef Diretivas para cobrir diferentes sistemas.

Aqui estão as regras que fornecerão o diretório doméstico

  • Windows: Env USERPROFILE ou se isso falhar, concatenar HOMEDRIVE+HOMEPATH
  • Linux, Unix e OS X: Env HOME ou se isso falhar, use getpwuid() (código de exemplo)

Observação importante: Muitas pessoas estão assumindo que HOME A variável de ambiente está sempre disponível no Unix, mas isso não é verdade, um bom exemplo seria o OS X.

No OS X, quando você executa um aplicativo da GUI (não console), isso não terá esse conjunto de variáveis, portanto, você precisa usar o getpwuid ().

O diretório doméstico não é realmente um conceito de plataforma cruzada. Sua sugestão da raiz do diretório de perfil (%UserProfile%) é uma analogia justa, mas dependendo do que você deseja fazer depois de ter o diretório, você pode querer um dos diretórios de dados do aplicativo ou os meus documentos do usuário. No Unix, você pode criar um ".myapp" oculto no diretório doméstico para manter seus arquivos, mas isso não está certo no Windows.

Sua melhor aposta é escrever código específico para cada plataforma, para obter o diretório que você deseja em cada caso. Dependendo do quão correto você deseja estar, pode ser suficiente usar o Env Vars: Home no Unix, UserProfile ou AppData (dependendo do que você precisa) no Windows.

No UNIX, pelo menos (qualquer pessoal do Windows se importa para comentar?), Geralmente é uma boa prática usar a variável de ambiente doméstico se estiver definido, mesmo que discorde do diretório específico no arquivo de senha. Então, na ocasião ímpar em que os usuários desejam que todos os aplicativos leiam seus dados de um diretório diferente, ele ainda funcionará.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top