Получение пути к домашнему каталогу в С#?
Хорошо, я проверил 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%
может работать на вас. В противном случае здесь довольно хороший список переменных окружения.