Как я могу получить каталог текущего пользователя?


101

Используя это:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

Я получаю такой вывод:

"C:\\Documents and Settings\\[USER]\\Application Data"

Как я могу получить корневой каталог всех пользователей? то есть:

"C:\\Documents and Settings\\[USER]\\"

1
Ответ, который я использовал, был удален ... это работает: Path.GetDirectoryName (Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData))
juan

2
Хуан - это не всегда сработает для тебя - на этот раз тебе просто повезло.
Скотт Айви,

это почему? Вы имеете в виду, как в перспективе? или в xp вдруг перестанет работать?
juan

5
см. комментарий Скотта к ответу Джея Риггса. В W7 и Vista папка Application Data находится в другом месте, поэтому вам нужно будет перейти на 2 каталога вверх, а не на 1.
Томас

Ответы:


49

Возможно, это будет хорошее решение: учитывая, Vista / Win7 или XP, и без использования переменных окружения:

string path = Directory.GetParent(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)).FullName;
if ( Environment.OSVersion.Version.Major >= 6 ) {
    path = Directory.GetParent(path).ToString();
}

Хотя использование переменной окружения намного понятнее.


166

Пытаться:

System.Environment.GetEnvironmentVariable("USERPROFILE");

Редактировать:

Если вы используете версию .NET 4 или выше, вы можете использовать Environment.SpecialFolderперечисление:

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

16
Очень плохая идея - полагаться на переменные среды, чтобы указать пути к папкам. Есть слишком много способов изменить эти переменные среды. Рекомендуемый способ - перечисление Environment.SpecialFolder.
Джим Мишель,

1
К сожалению, как вы видите, msdn.microsoft.com/en-us/library/… папка USERPROFILE не содержится в этом перечислении.
Thomas

Environment.SpecialFolder входит в .NET 1.1, просто не имеет папки "UserProfile" ...
Вини,

@JimMischel Но разве они не меняются? И если вы всегда ссылаетесь на переменную среды, все в порядке.
Нейт-Уилкинс,

22

Вы можете получить путь к UserProfile вот так:

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);


11

Также очень полезно при исследовании Environment.SpecialFolderenum. Используйте LINQPad или создайте решение и выполните этот код:

Enum.GetValues(typeof(Environment.SpecialFolder))
    .Cast<Environment.SpecialFolder>()
    .Select(specialFolder => new
    {
        Name = specialFolder.ToString(),
        Path = Environment.GetFolderPath(specialFolder)
    })
    .OrderBy(item => item.Path.ToLower())

Пути к папкам

Вот результат на моей машине:

MyComputer
LocalizedResources
CommonOemLinks
ProgramFiles            C:\Program Files (x86) 
ProgramFilesX86         C:\Program Files (x86) 
CommonProgramFiles      C:\Program Files (x86)\Common Files 
CommonProgramFilesX86   C:\Program Files (x86)\Common Files 
CommonApplicationData   C:\ProgramData 
CommonStartMenu         C:\ProgramData\Microsoft\Windows\Start Menu 
CommonPrograms          C:\ProgramData\Microsoft\Windows\Start Menu\Programs 
CommonAdminTools        C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools 
CommonStartup           C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup 
CommonTemplates         C:\ProgramData\Microsoft\Windows\Templates 
UserProfile             C:\Users\fisch 
LocalApplicationData    C:\Users\fisch\AppData\Local 
CDBurning               C:\Users\fisch\AppData\Local\Microsoft\Windows\Burn\Burn 
History                 C:\Users\fisch\AppData\Local\Microsoft\Windows\History 
InternetCache           C:\Users\fisch\AppData\Local\Microsoft\Windows\INetCache 
Cookies                 C:\Users\fisch\AppData\Local\Microsoft\Windows\INetCookies 
ApplicationData         C:\Users\fisch\AppData\Roaming 
NetworkShortcuts        C:\Users\fisch\AppData\Roaming\Microsoft\Windows\Network Shortcuts 
PrinterShortcuts        C:\Users\fisch\AppData\Roaming\Microsoft\Windows\Printer Shortcuts 
Recent                  C:\Users\fisch\AppData\Roaming\Microsoft\Windows\Recent 
SendTo                  C:\Users\fisch\AppData\Roaming\Microsoft\Windows\SendTo 
StartMenu               C:\Users\fisch\AppData\Roaming\Microsoft\Windows\Start Menu 
Programs                C:\Users\fisch\AppData\Roaming\Microsoft\Windows\Start Menu\Programs 
AdminTools              C:\Users\fisch\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools 
Startup                 C:\Users\fisch\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 
Templates               C:\Users\fisch\AppData\Roaming\Microsoft\Windows\Templates 
Desktop                 C:\Users\fisch\Desktop 
DesktopDirectory        C:\Users\fisch\Desktop 
Favorites               C:\Users\fisch\Favorites 
MyMusic                 C:\Users\fisch\Music 
MyDocuments             C:\Users\fisch\OneDrive\Documents 
MyDocuments             C:\Users\fisch\OneDrive\Documents 
MyPictures              C:\Users\fisch\OneDrive\Pictures 
MyVideos                C:\Users\fisch\Videos 
CommonDesktopDirectory  C:\Users\Public\Desktop 
CommonDocuments         C:\Users\Public\Documents 
CommonMusic             C:\Users\Public\Music 
CommonPictures          C:\Users\Public\Pictures 
CommonVideos            C:\Users\Public\Videos 
Windows                 C:\Windows 
Fonts                   C:\Windows\Fonts 
Resources               C:\Windows\resources 
System                  C:\Windows\system32 
SystemX86               C:\Windows\SysWoW64 

(«fisch» - это первые 5 букв моей фамилии. Это имя пользователя назначается при входе в учетную запись Microsoft.)


Не знаю, как я никогда не слышал о LINQPad, пробовал, отличная штука, спасибо, что порекомендовали.
TravisO

4
Environment.GetEnvironmentVariable("userprofile")

Попытка перейти вверх от именованной папки SpecialFolder чревата проблемами. Существует множество причин, по которым папки не будут там, где вы их ожидаете: пользователи могут перемещать их самостоятельно, объект групповой политики может перемещать их, перенаправление папок на пути UNC и т. Д.

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


3

Пытаться:

System.IO.Directory.GetParent(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)).FullName/

1
Это не будет работать в Windows 7, и я предполагаю, что не будет работать и на Vista, если я правильно помню структуру папок. На 7 вам нужно будет перейти на 2 родительские папки, поскольку папка ApplicationData - это \% userprofile% \ AppData \ Roaming \
Скотт Айви

Это возвращает «C: \ Users \ Fredrik \ AppData» на моем компьютере с Vista (папка ApplicationData - «C: \ Users \ Fredrik \ AppData \ Roaming»)
Фредрик Мерк,

1

Возиться с переменными среды или жестко заданными смещениями родительских папок никогда не будет хорошей идеей, когда есть API для получения нужной информации, вызовите SHGetSpecialFolderPath(...,CSIDL_PROFILE,...)


-3
$env:USERPROFILE = "C:\\Documents and Settings\\[USER]\\"

Посмотрите комментарии к вопросу. Это не относится ко всем версиям Windows.
Вай Ха Ли

-3

вы можете использовать следующий код:

if(Platform.Equals("WinCE"))
{
    m_CurrentPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
}
else if(Platform.Equals("Win32NT"))
{
    m_CurrentPath = Directory.GetCurrentDirectory();
}

дополнительную информацию см .: Получить текущий путь к каталогу в WinXP и WinCE с C #


3
Здесь это совершенно неуместно. OP запрашивает текущую пользовательскую папку, а не рабочую папку.
julealgon
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.