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

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

Я хочу получить домашний каталог текущего пользователя в C #. (например.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%");
 MSalters17 июл. 2009 г., 16:55
Не знаю о вашей машине, но на моем компьютере XP% HOMEDRIVE %% HOMEPATH% - это сетевой каталог, а не c: \ Documents and Settings \ user \ MSalters \
 Matthew Scharley17 июл. 2009 г., 17:01
Если честно, я считаю, что именно эта проблема является неполной реализацией .NET ... вы должны посмотреть документацию для CSIDLS (msdn.microsoft.com/en-us/library/bb762494.aspx), чтобы увидеть полный список того, что поддерживает Windows: на самом деле вы ищете CSIDL_PROFILE, который поддерживается в Windows, но не .NET по какой-то непостижимой причине.
 Peteter07 мая 2012 г., 17:05
Я думаю, вы должны поставить результат в ответ, в следующий раз.
 Stefan Steiger06 сент. 2015 г., 23:26
PlatformID.MacOSX не требуется, PlatformID.Unix возвращает значение true и в MacOSX (или, по крайней мере, раньше).
 Boris Callens17 июл. 2009 г., 16:48
БУМ. Самый быстрый пистолет на западе: P

Ответы на вопрос(8)

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

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

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

 17 июл. 2009 г., 16:56
Should, Реализация MS не делает этого.
 17 июл. 2009 г., 16:48
Если только вы не используете какую-то интеллектуальную реализацию Framework Environment.GetFolder () должен работать кроссплатформенно.

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

var envHome = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "HOMEPATH" : "HOME";
var home = Environment.GetEnvironmentVariable(envHome);`
 17 авг. 2017 г., 00:23
Я использую 2.0 иSystem.Environment.SpecialFolder существует
Решение Вопроса

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

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

 17 июл. 2009 г., 16:53
Разве вы не можете использовать% USERPROFILE% в Windows?
 17 июл. 2009 г., 17:04
person-b,% USERPROFILE% и% HOMEDRIVE %% HOMEPATH% часто одинаковы на персональных ПК, но часто указывают на разные места в сетевых средах. Например, на работе мой USERPROFILE - это C: \ Documents and Settings \ username, а домашний каталог - Z: \, который является сетевым диском, который регулярно резервируется ИТ-специалистами.
 17 июл. 2009 г., 16:54
$ HOME также работает на OS X Это все еще не является правильным ответом, поскольку я рассматриваю это, поскольку вы делаете обнаружение платформы ... но чтобы получить точные запрашиваемые значения, это о том, что вы должны делать.
 17 июл. 2009 г., 16:50
Я точно знаю, что HOMEDRIVE не существует в * nix, и обычно это просто HOME, а не HOMEPATH.
 17 июл. 2009 г., 16:51
Мэтью, ты прав. Я добавил пояснения к оригинальному комментарию.

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

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

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

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

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

 17 июл. 2009 г., 16:50
& quot; Мои документы & quot;is Windows ближе всего к домашнему каталогу.
 MiffTheFox17 июл. 2009 г., 16:48
Это возвращает папку «Мои документы».
 03 июл. 2012 г., 06:57
Обратите внимание, что Environment.SpecialFolder.UserProfile доступен в .NET 4.0, что вам и нужно
 17 июл. 2009 г., 16:52
Не совсем ... но альтернативой является PInvoke, и OP попросил об управляемом решении.
 MiffTheFox17 июл. 2009 г., 16:51
@MStallers Нет,% HOMEDRIVE %% HOMEPATH% есть.
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

 03 июл. 2012 г., 06:54
Обратите внимание, что UserProfile является новым в .NET 4.0, если вы используете .NET 2.0 / 3.5, вам придется вручную вызывать Win32 API со значением 40 для UserProfile.
 26 дек. 2014 г., 14:51
Не забудьте использовать System.IO.Path.DirectorySeparatorChar, чтобы создать путь к файлу, чтобы он был переносимым.
 29 янв. 2014 г., 16:11
И & quot; Мои документы & quot; не совпадает с домашним каталогом, за исключением Windows 95, 98 и ME.
 08 мар. 2015 г., 22:12
Не используйте DirectorySeperatorChar вручную. Используйте Path.Combine.

Ваш ответ на вопрос