Obtenir le chemin du répertoire personnel en C #?

101

D'accord, j'ai vérifié Environment.SpecialFolder, mais il n'y a rien là-dedans pour cela.

Je veux obtenir le répertoire personnel de l'utilisateur actuel en C #. (par exemple c:\documents and settings\usersous XP, c:\users\usersous Vista et /home/usersous Unix.)

Je sais que je peux lire les variables d'environnement pour le découvrir, mais je veux le faire de manière multiplateforme.

Est-il possible que je puisse faire cela avec .NET (de préférence en utilisant mscorlib)?

MISE À JOUR : D'accord, c'est le code que j'ai fini par utiliser:

string homePath = (Environment.OSVersion.Platform == PlatformID.Unix || 
                   Environment.OSVersion.Platform == PlatformID.MacOSX)
    ? Environment.GetEnvironmentVariable("HOME")
    : Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%");
MiffTheFox
la source
2
BOOM. Canon le plus rapide de l'ouest: P
Boris Callens
Je ne sais pas pour votre machine, mais sur ma boîte XP% HOMEDRIVE %% HOMEPATH% est un répertoire réseau, pas c: \ Documents and Settings \ user \ MSalters \
MSalters
Pour être honnête, je considère que ce problème exact est une sous-implémentation de .NET ... vous devriez consulter la documentation de CSIDLS ( msdn.microsoft.com/en-us/library/bb762494.aspx ) pour voir une liste complète de ce que Windows prend en charge: Ce que vous recherchez réellement, c'est CSIDL_PROFILE, qui est pris en charge dans Windows, mais pas par .NET pour une raison insondable.
Matthew Scharley
1
Je pense que vous devriez mettre le résultat dans une réponse, la prochaine fois.
Peteter
PlatformID.MacOSX n'est pas nécessaire, PlatformID.Unix retourne aussi vrai sur MacOSX (ou du moins il le faisait auparavant).
Stefan Steiger

Réponses:

51

Environment.SpecialFolder.Personalne renvoie pas réellement le dossier de départ, il renvoie le dossier Mes documents . Le moyen le plus sûr d'obtenir le dossier de départ sur Win32 est de le lire %HOMEDRIVE%%HOMEPATH%. La lecture des variables d'environnement est en fait très portable à faire (sous Unix et Windows), donc je ne sais pas pourquoi l'affiche a voulu ne pas le faire.

Édité pour ajouter: Pour le C # crossplatform (Windows / Unix), j'avais lu $HOMEsur Unix et OSX et %HOMEDRIVE%%HOMEPATH%sur Windows.

sigint
la source
Je sais que HOMEDRIVE n'existe pas sur * nix, et normalement c'est juste HOME, pas HOMEPATH.
Matthew Scharley
Matthew, tu as raison. J'ai ajouté une clarification sur le commentaire original.
sigint le
12
Vous ne pouvez pas utiliser% USERPROFILE% sous Windows?
Lucas Jones
1
$ HOME fonctionne également sur OS X. Ce n'est toujours pas la bonne réponse en ce qui me concerne, car vous faites de la détection de plate-forme ... mais pour obtenir les valeurs exactes demandées, c'est à peu près ce que vous devez faire.
Matthew Scharley
2
person-b,% USERPROFILE% et% HOMEDRIVE %% HOMEPATH% sont souvent les mêmes sur les PC personnels, mais indiquent souvent des endroits différents dans des environnements en réseau. Par exemple, au travail, mon USERPROFILE est C: \ Documents and Settings \ username mais le répertoire de base est Z: \, qui est un lecteur en réseau qui est régulièrement sauvegardé par le service informatique.
sigint le
92
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)

Personnel est Mes Documents (ou Documents dans win7 et au-dessus).

James
la source
8
Notez que UserProfile est nouveau dans .NET 4.0, si vous utilisez .NET 2.0 / 3.5, vous devez appeler l'API win32 manuellement avec la valeur 40 pour UserProfile
linquize le
Et «Mes documents» n'est pas le même que le répertoire personnel, sauf sous Windows 95, 98 et ME.
Jon Hanna
1
N'oubliez pas d'utiliser System.IO.Path.DirectorySeparatorChar pour créer votre chemin de fichier afin de le garder portable.
thomiel
4
N'utilisez pas DirectorySeperatorChar manuellement. Utilisez Path.Combine.
John Gietzen
14

Je crois que ce que vous recherchez est:

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

Pour référence, il est en fait contenu dans mscorlib.

Matthew Scharley
la source
Cela renvoie le dossier Mes documents.
MiffTheFox
«Mes documents» est l'élément le plus proche de Windows d'un répertoire personnel.
MSalters
8
@MStallers Non,% HOMEDRIVE %% HOMEPATH% l'est.
MiffTheFox
Pas tout à fait ... mais l'alternative est PInvoke, et l'OP a demandé une solution gérée.
Matthew Scharley
7
Notez que Environment.SpecialFolder.UserProfile est disponible dans .NET 4.0, ce que vous voulez
linquize le
8

Dans DotNetCore 1.1 System.Environment.SpecialFoldern'existe pas. Il peut exister en version 2.0-beta. Jusque-là, pour ce faire, vous pouvez utiliser les éléments suivants:

var envHome = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "HOMEPATH" : "HOME";
var home = Environment.GetEnvironmentVariable(envHome);`
KBP
la source
J'utilise 2.0 et System.Environment.SpecialFolderexiste
snotyak
4

La réponse est non. Il n'y a pas de méthode simple basée sur le système dans .NET pour obtenir le répertoire Home de telle sorte que nous pourrions nous attendre à une implémentation à la fois dans .NET sous Windows et en Mono.

Vous devrez effectuer une détection du système d'exploitation et passer au code spécifique du système d'exploitation.

AnthonyWJones
la source
1

Quand vous parlez de manière multiplateforme, quels autres systèmes d'exploitation devez-vous prendre en charge? Vous devrez peut-être effectuer une détection simple du système d'exploitation pour sélectionner la méthode de recherche du répertoire de base si vous exécutez sur un système d'exploitation non Windows.

Ce site Web semble offrir un moyen de faire ce dont vous avez besoin dans Windows.

John D.
la source
Sauf si vous utilisez une implémentation braindead du Framework Environment, GetFolder () devrait fonctionner sur plusieurs plates-formes.
R. Martinho Fernandes
2
Devrait . La mise en œuvre de MS ne le fait pas.
R. Martinho Fernandes
1

Cela peut être fait en utilisant GetEnvironmentVariabledans 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'");
    }
}

Ensuite, il produit sous windows: C:\\\\Users\\myusername\\myFolder

Notez que si vous utilisez

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

il échoue car il produit: \\Users\\myusername\\myFolder

Nicosmik
la source
0

Je n'ai pas de machine pour le tester, mais cela %HOMESHARE%pourrait fonctionner pour vous. Sinon, voici une assez bonne liste de variables d'environnement .

JP Alioto
la source