Obtendo o caminho do diretório inicial em C #?


101

Ok, verifiquei Environment.SpecialFolder, mas não há nada lá para isso.

Quero obter o diretório inicial do usuário atual em C #. (por exemplo, c:\documents and settings\userno XP, c:\users\userno Vista e /home/userno Unix.)

Sei que posso ler variáveis ​​de ambiente para descobrir isso, mas quero fazer isso de uma maneira multiplataforma.

Existe alguma maneira de fazer isso com o .NET (de preferência usando mscorlib)?

ATUALIZAÇÃO : Ok, este é o código que acabei usando:

string homePath = (Environment.OSVersion.Platform == PlatformID.Unix || 
                   Environment.OSVersion.Platform == PlatformID.MacOSX)
    ? Environment.GetEnvironmentVariable("HOME")
    : Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%");

2
ESTRONDO. Arma mais rápida do oeste: P
Boris Callens

Não sei sobre sua máquina, mas na minha caixa XP% HOMEDRIVE %% HOMEPATH% é um diretório de rede, não c: \ Documents and Settings \ user \ MSalters \
MSalters

Para ser honesto, considero este problema exato uma subimplementação do .NET ... você deve olhar a documentação do CSIDLS ( msdn.microsoft.com/en-us/library/bb762494.aspx ) para ver uma lista completa de o que o Windows oferece suporte: O que você realmente está procurando é CSIDL_PROFILE, que é compatível com o Windows, mas não com o .NET por algum motivo insondável.
Matthew Scharley

1
Acho que você deveria colocar o resultado em uma resposta da próxima vez.
Peteter

PlatformID.MacOSX não é necessário, PlatformID.Unix retorna true no MacOSX também (ou pelo menos costumava).
Stefan Steiger,

Respostas:


51

Environment.SpecialFolder.Personalnão retorna realmente a pasta de início, ele retorna a pasta Meus documentos . A maneira mais segura de obter a pasta de início no Win32 é lendo %HOMEDRIVE%%HOMEPATH%. A leitura de variáveis ​​de ambiente é, na verdade, muito portátil (no Unix e no Windows), então não sei por que o autor da postagem não quis fazer isso.

Editado para adicionar: Para crossplatform (Windows / Unix) C #, eu li $HOMEno Unix e OSX e %HOMEDRIVE%%HOMEPATH%no Windows.


Eu sei que para um fato HOMEDRIVE não existe em * nix, e normalmente é apenas HOME, não HOMEPATH.
Matthew Scharley

Matthew, você está certo. Eu adicionei um esclarecimento sobre o comentário original.
sigint

12
Você não pode usar% USERPROFILE% no Windows?
Lucas Jones

1
$ HOME também funciona no OS X. Esta ainda não é a resposta correta para mim, já que você está fazendo a detecção de plataforma ... mas para obter os valores exatos solicitados, é isso que você precisa fazer.
Matthew Scharley

2
person-b,% USERPROFILE% e% HOMEDRIVE %% HOMEPATH% são freqüentemente iguais em PCs pessoais, mas freqüentemente apontam para locais diferentes em ambientes de rede. Por exemplo, no trabalho, meu USERPROFILE é C: \ Documents and Settings \ nome de usuário, mas o diretório inicial é Z: \, que é uma unidade de rede cujo backup é feito por TI regularmente.
sigint

92
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)

Pessoal é Meus Documentos (ou Documentos em win7 e superior).


8
Observe que UserProfile é novo no .NET 4.0, se você usar .NET 2.0 / 3.5, deverá chamar a API win32 manualmente com o valor 40 para UserProfile
linquize

E "Meus Documentos" não é o mesmo que o diretório inicial, exceto no Windows 95, 98 e ME.
Jon Hanna

1
Não se esqueça de usar System.IO.Path.DirectorySeparatorChar para construir o caminho do arquivo a fim de mantê-lo portátil.
thomiel

4
Não use DirectorySeperatorChar manualmente. Use Path.Combine.
John Gietzen

14

Eu acredito que você está procurando:

System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)

Para referência, está contido em mscorlib.


Isso retorna a pasta Meus Documentos.
MiffTheFox

"Meus documentos" é a coisa mais próxima que o Windows tem de um diretório inicial.
MSalters

8
@MStallers Não,% HOMEDRIVE %% HOMEPATH% é.
MiffTheFox

Não exatamente ... mas a alternativa é PInvoke, e o OP pediu uma solução gerenciada.
Matthew Scharley

7
Observe que Environment.SpecialFolder.UserProfile está disponível em .NET 4.0, que é o que você deseja
linquize de

8

Em DotNetCore 1.1 System.Environment.SpecialFoldernão existe. Pode existir na versão 2.0-beta. Até então, para fazer isso, você pode usar o seguinte:

var envHome = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "HOMEPATH" : "HOME";
var home = Environment.GetEnvironmentVariable(envHome);`

Estou usando 2.0 e System.Environment.SpecialFolderexiste
snotyak de

4

A resposta final é Não. Não é um método simples baseado em sistema no .NET para obter o diretório inicial de forma que poderíamos esperar uma implementação em .NET no Windows e no Mono.

Você precisará fazer alguma detecção de sistema operacional e ramificar para um código específico de sistema operacional.


1

Quando você fala em plataforma cruzada, quais outros sistemas operacionais você precisa oferecer suporte? Pode ser necessário fazer uma detecção simples de sistema operacional para selecionar o método de localização do diretório inicial, se estiver executando em um sistema operacional diferente do Windows.

Este site parece dar uma maneira de fazer o que você precisa no Windows.


A menos que você esteja usando alguma implementação braindead do Framework Environment.GetFolder () deve funcionar em várias plataformas.
R. Martinho Fernandes

2
Deveria . A implementação da MS não o faz.
R. Martinho Fernandes

1

Isso pode ser feito usando GetEnvironmentVariableem System.IO:

public string GetUserHome() {
    var homeDrive = Environment.GetEnvironmentVariable("HOMEDRIVE");
    if (!string.IsNullOrWhiteSpace(homeDrive))
    {
        var homePath = Environment.GetEnvironmentVariable("HOMEPATH");
        if (!string.IsNullOrWhiteSpace(homePath))
        {            
            var fullHomePath = homeDrive + Path.DirectorySeparatorChar + homePath;
            return Path.Combine(fullHomePath, "myFolder");
        }
        else
        {
            throw new Exception("Environment variable error, there is no 'HOMEPATH'");
        }
    }
    else
    {
        throw new Exception("Environment variable error, there is no 'HOMEDRIVE'");
    }
}

Em seguida, ele produz no Windows: C:\\\\Users\\myusername\\myFolder

Observe que se você usar

var fullHomePath = Path.Combine(homeDrive.ToString(), homePath.ToString())

falha porque produz: \\Users\\myusername\\myFolder


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.