Получение пути к домашнему каталогу в С#?

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

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

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

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

UPDATE: Хорошо, это код, в котором я закончил:

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

Ответ 1

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

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

Ответ 2

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

Вам нужно будет выполнить некоторое обнаружение ОС и перейти к конкретному коду ОС.

Ответ 6

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

Этот веб-сайт, похоже, дает возможность делать то, что вам нужно в Windows.

Ответ 7

Это можно сделать с помощью GetEnvironmentVariable в 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'");
    }
}

Затем он производит под окнами: C:\\\\Users\\myusername\\myFolder

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

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

не удается, потому что он производит: \\Users\\myusername\\myFolder

Ответ 8

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