Получение пути к домашнему каталогу в C #? - PullRequest
89 голосов
/ 17 июля 2009

Хорошо, я проверил Environment.SpecialFolder, но там для этого ничего нет.

Я хочу получить домашний каталог текущего пользователя в C #. (например, c:\documents and settings\user под XP, c:\users\user под Vista и /home/user под Unix.)

Я знаю, что могу прочитать переменные окружения, чтобы выяснить это, но я хочу сделать это кросс-платформенным способом.

Есть ли способ сделать это с .NET (желательно с помощью mscorlib)?

ОБНОВЛЕНИЕ : Хорошо, это код, который я использовал в итоге:

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

Ответы [ 8 ]

79 голосов
/ 13 сентября 2011
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

Личное - это мои документы (или документы в win7).

46 голосов
/ 17 июля 2009

Environment.SpecialFolder.Personal фактически не возвращает домашнюю папку, она возвращает папку Мои документы . Самый безопасный способ получить домашнюю папку на Win32 - это прочитать %HOMEDRIVE%%HOMEPATH%. Чтение переменных среды на самом деле очень переносимо (в Unix и Windows), поэтому я не уверен, почему автор хотел , а не .

Отредактировано, чтобы добавить: Для кроссплатформенности (Windows / Unix) C # я прочитал бы $HOME в Unix и OSX и %HOMEDRIVE%%HOMEPATH% в Windows.

12 голосов
/ 17 июля 2009

Я считаю, что вы ищете:

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

Для справки, оно содержится в mscorlib.

5 голосов
/ 08 августа 2017

В DotNetCore 1.1 System.Environment.SpecialFolder не существует. Это может существовать в 2.0-бета. До этого для этого вы можете использовать следующее:

var envHome = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "HOMEPATH" : "HOME";
var home = Environment.GetEnvironmentVariable(envHome);`
3 голосов
/ 17 июля 2009

Ответ в нижней строке: Нет. Это не простой системный метод в .NET, чтобы получить домашний каталог, чтобы можно было ожидать реализации как в .NET в Windows, так и в Mono.

Вам нужно будет выполнить некоторое обнаружение ОС и перейти к коду, специфичному для ОС.

1 голос
/ 17 июля 2009

Когда вы говорите о кроссплатформенности, какие еще ОС вам нужно поддерживать? Вам может потребоваться выполнить простое обнаружение ОС, чтобы выбрать метод поиска домашнего каталога, если вы работаете в ОС, отличной от Windows.

Этот сайт , кажется, дает возможность делать то, что вам нужно в Windows.

0 голосов
/ 17 марта 2015

Это можно сделать, используя GetEnvironmentVariable in 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'");
    }
}

Тогда выдает под windows: C:\\\\Users\\myusername\\myFolder

Обратите внимание, что если вы используете

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

происходит сбой, потому что он производит: \\Users\\myusername\\myFolder

0 голосов
/ 17 июля 2009

У меня нет машины для тестирования, но %HOMESHARE% может работать для вас. Иначе, вот неплохой список переменных окружения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...