Отримання шляху до домашнього каталогу в C #?


101

Гаразд, я перевірив 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%");

2
БУМ. Найшвидший пістолет на заході: Р
Борис Калленс

Не знаю про свою машину, але в моєму XP-полі% HOMEDRIVE %% HOMEPATH% - це мережевий каталог, а не c: \ Документи та налаштування \ користувач \ MSalters \
MSalters

Якщо чесно, я вважаю цю точну проблему недостатнім застосуванням .NET ... вам слід переглянути документацію для CSIDLS ( msdn.microsoft.com/en-us/library/bb762494.aspx ), щоб побачити повний список що підтримує Windows: те, що ви насправді шукаєте, це CSIDL_PROFILE, який підтримується в Windows, але не .NET з незрозумілих причин.
Меттью Шарлі

1
Я думаю, ви повинні поставити результат у відповідь наступного разу.
Пітер

PlatformID.MacOSX не потрібен, PlatformID.Unix також повертає істину на MacOSX (або, принаймні, раніше).
Штефан Штайгер

Відповіді:


51

Environment.SpecialFolder.Personalнасправді не повертає домашню папку, вона повертає папку " Мої документи" . Найбезпечніший спосіб отримати домашню папку на Win32 - це прочитати %HOMEDRIVE%%HOMEPATH%. Змінні середовища читання насправді дуже портативні (у Unix та Windows), тому я не впевнений, чому плакат хотів цього не робити.

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


Я знаю, адже HOMEDRIVE не існує на * nix, і зазвичай це просто ДОМАШНЯ, а не ГОМЕПАТА.
Меттью Шарлі

Метью, ти маєш рацію. Я додав уточнення до оригінального коментаря.
підпис

12
Не можете використовувати% USERPROFILE% у Windows?
Лукас Джонс

1
$ HOME працює і на OS X. Це все ще не є правильною відповіддю, наскільки я стурбований, хоча, оскільки ви займаєтеся виявленням платформи ... але щоб отримати точні значення, просити вас, це те, що вам потрібно зробити.
Меттью Шарлі

2
person-b,% USERPROFILE% та% HOMEDRIVE %% HOMEPATH% часто однакові на персональних ПК, але часто вказують на різні місця в мережевих середовищах. Наприклад, на роботі мій USERPROFILE - це C: \ Документи та налаштування \ ім'я користувача, але домашній каталог - Z: \, що є мережевим накопичувачем, який регулярно резервується ІТ.
підпис

92
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)

Особисті - це Мої документи (або Документи у програмі win7 та вище).


8
Зауважте, що UserProfile є новим у .NET 4.0, якщо ви використовуєте .NET 2.0 / 3.5, вам доведеться викликати API Win32 вручну зі значенням 40 для UserProfile
зв’язати

І "Мої документи" не те саме, що домашній каталог, за винятком Windows 95, 98 та ME.
Джон Ханна

1
Не забудьте використовувати System.IO.Path.DirectorySeparatorChar для побудови файлового шляху, щоб зберегти його портативним.
thomiel

4
Не використовуйте DirectorySeperatorChar вручну. Використовуйте Path.Combine.
Джон Гітцен

14

Я вважаю, що ви шукаєте:

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

Для довідки, це речовина, що міститься в mscorlib.


Це повертає папку "Мої документи".
MiffTheFox

"Мої документи" - це найближче, що Windows має до домашнього каталогу.
MSalters

8
@MStallers Ні,% HOMEDRIVE %% HOMEPATH% є.
MiffTheFox

Не зовсім ... але альтернативою є PInvoke, і ОП попросила керованого рішення.
Меттью Шарлі

7
Зауважте, що Environment.SpecialFolder.UserProfile доступний у .NET 4.0, що саме ви хочете
зв’язати

8

У DotNetCore 1.1 System.Environment.SpecialFolderне існує. Він може існувати в 2.0-бета-версії. До цього часу для цього ви можете скористатися наступним:

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

Я використовую 2.0 і System.Environment.SpecialFolderіснує
snotyak

4

Відповідь в нижньому рядку - Ні. Простий системний метод у .NET не дозволяє отримати домашній каталог таким чином, що ми могли б очікувати впровадження як в .NET в Windows, так і в Mono.

Вам потрібно буде виконати деяке виявлення ОС та відгалуження до конкретного коду ОС.


1

Коли ви говорите міжплатформенний спосіб, які ще ОС вам потрібно підтримувати? Можливо, вам доведеться виконати просте виявлення ОС, щоб вибрати метод пошуку домашнього каталогу, якщо ви працюєте в ОС, яка не є ОС Windows.

Цей веб-сайт, здається, дає спосіб робити те, що потрібно в Windows.


Якщо ви не використовуєте певну реалізацію рамкового середовища Environment.GetFolder (), то це мусить працювати на різних платформах.
Р. Мартіньо Фернандес

2
Повинен . Реалізація MS не робить цього.
Р. Мартіньо Фернандес

1

Це може бути зроблено з допомогою 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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.