2009-07-17 2 views
76

Хорошо, я проверил Environment.SpecialFolder, но для этого нет ничего.Как добраться до исходного каталога в C#?

Я хочу получить домашний каталог текущего пользователя на 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%"); 
+2

BOOM. Самый быстрый пистолет на западе: P –

+0

Dunno о вашей машине, но на моей коробке XP% HOMEDRIVE %% HOMEPATH% - это сетевой каталог, а не c: \ Documents and Settings \ user \ MSalters \ – MSalters

+0

Честно говоря, я считаю это точным проблема заключается в недоиспользовании .NET ... вы должны посмотреть документацию для CSIDLS (http://msdn.microsoft.com/en-us/library/bb762494.aspx), чтобы увидеть полный список того, что поддерживает Windows: Фактически вы ищете CSIDL_PROFILE, который поддерживается в Windows, но не .NET по какой-то непостижимой причине. –

ответ

40

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

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

+0

Я знаю, что факт HOMEDRIVE не существует на * nix, и обычно это просто ДОМ, а не HOMEPATH. –

+0

Мэтью, ты прав. Я добавил разъяснение по оригинальному комментарию. – sigint

+0

+1 Согласен, это самое близкое, что мы собираемся получить. – AnthonyWJones

9

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

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

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

+0

Это возвращает папку «Мои документы». – MiffTheFox

+0

«Мои документы» * - это самая близкая вещь, которую Windows имеет в домашнем каталоге. – MSalters

+6

@MStallers Нет,% HOMEDRIVE %% HOMEPATH% есть. – MiffTheFox

0

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

This website, похоже, дает возможность делать то, что вам нужно в Windows.

+0

Если вы не используете некоторую реализацию Framework Framework Framework. GetFolder() должен работать кросс-платформенно. –

+2

* Должно *. Реализация MS не делает этого. –

0

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

3

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

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

65
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); 

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

+8

Обратите внимание, что UserProfile является новым в .NET 4.0, если вы используете .NET 2.0/3.5, вы должны вручную вызвать win32 API со значением 40 для UserProfile – linquize

+0

И «Мои документы» не совпадают с домашним каталогом, за исключением Windows 95, 98 и ME. –

+1

Не забудьте использовать System.IO.Path.DirectorySeparatorChar для создания пути к файлу, чтобы он был переносимым. – thomiel

0

Предложение:

using System.IO; 
var homeDrive = Environment.GetEnvironmentVariable("HOMEDRIVE"); 
if (homeDrive != null) 
{ 
    var homePath = Environment.GetEnvironmentVariable("HOMEPATH"); 
    if (homePath != null) 
    {    
    var fullHomePath = homeDrive + Path.DirectorySeparatorChar + homePath; 
    FolderPath = 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

4

В DotNetCore 1.1 System.Environment.SpecialFolder не exi ул. Он может существовать в версии 2.0 beta. До этого вы можете использовать следующее:

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

Я использую 2.0 и 'System.Environment.SpecialFolder' существует – snotyak

Смежные вопросы