Jak mogę uzyskać aktualny katalog użytkownika?

100

Używając tego:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

Otrzymuję ten wynik:

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

Jak mogę uzyskać katalog główny wszystkich użytkowników? to znaczy:

"C:\\Documents and Settings\\[USER]\\"
juan
źródło
1
Odpowiedź I skończył przy użyciu zostało usunięte ... to działa: Path.GetDirectoryName (Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData))
Juan
2
Juan - to nie zawsze zadziała dla ciebie - tym razem po prostu ci się poszczęściło.
Scott Ivey,
dlaczego? masz na myśli jak w Vista? czy w xp nagle przestanie działać?
juan
5
zobacz komentarz Scotta na temat odpowiedzi Jaya Riggsa. W W7 i Vista folder Application Data znajduje się w innym miejscu, więc musiałbyś przejść w górę o 2 katalogi, w przeciwieństwie do 1.
Thomas

Odpowiedzi:

48

Może to będzie dobre rozwiązanie: biorąc pod uwagę czy to Vista / Win7 czy XP i bez użycia zmiennych środowiskowych:

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

Chociaż użycie zmiennej środowiskowej jest znacznie bardziej przejrzyste.

Anton Kolesov
źródło
165

Próbować:

System.Environment.GetEnvironmentVariable("USERPROFILE");

Edytować:

Jeśli używana wersja .NET to 4 lub nowsza, możesz użyć Environment.SpecialFolderwyliczenia:

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
Tomasz
źródło
16
To naprawdę zły pomysł polegać na zmiennych środowiskowych, aby uzyskać ścieżki folderów. Istnieje zbyt wiele sposobów na zmianę tych zmiennych środowiskowych. Zalecanym sposobem jest wyliczenie Environment.SpecialFolder.
Jim Mischel,
1
Niestety, jak widać, msdn.microsoft.com/en-us/library/ ... folder USERPROFILE nie jest zawarty w tym wyliczeniu.
Thomas
Environment.SpecialFolder jest zawarty w .NET 1.1, po prostu nie ma folderu „UserProfile”…
Vini
@JimMischel Ale czy te rzekomo nie są zmienne? A jeśli zawsze odwołujesz się do zmiennej środowiskowej, wszystko jest w porządku.
Nate-Wilkins
22

Możesz uzyskać ścieżkę UserProfile za pomocą tego:

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

zionyx
źródło
11

Również bardzo pomocny podczas badania Environment.SpecialFolderenum. Użyj LINQPad lub utwórz rozwiązanie i wykonaj ten kod:

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

Ścieżki folderów

Oto wynik na moim komputerze:

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” to pierwsze 5 liter mojego nazwiska. Jest to nazwa użytkownika przypisywana podczas logowania się za pomocą konta Microsoft).

bytecode77
źródło
Nie wiem, jak nigdy nie słyszałem o LINQPad, wypróbowałem go, ta rzecz jest świetna, dzięki za polecenie.
TravisO,
4
Environment.GetEnvironmentVariable("userprofile")

Próba przejścia w górę z nazwanego folderu specjalnego jest podatna na problemy. Istnieje wiele powodów, dla których foldery nie będą tam, gdzie ich oczekujesz - użytkownicy mogą je przenosić samodzielnie, GPO może je przenosić, przekierowywanie folderów do ścieżek UNC itp.

Użycie zmiennej środowiskowej dla profilu użytkownika powinno odzwierciedlać każdy z tych możliwych problemów.

Scott Ivey
źródło
3

Próbować:

System.IO.Directory.GetParent(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)).FullName/
Jay Riggs
źródło
1
To nie zadziała w systemie Windows 7 i zakładam, że nie będzie działać również w systemie Vista, jeśli dobrze pamiętam strukturę folderów. W dniu 7 musiałbyś przejść w górę o 2 foldery nadrzędne, ponieważ folder ApplicationData to \% userprofile% \ AppData \ Roaming \
Scott Ivey
To zwraca „C: \ Users \ Fredrik \ AppData” na moim komputerze z systemem Vista (folder ApplicationData to „C: \ Users \ Fredrik \ AppData \ Roaming”)
Fredrik Mörk,
1

Majstrowanie przy zmiennych środowiskowych lub zakodowanych na stałe przesunięciami folderu nadrzędnego nigdy nie jest dobrym pomysłem, gdy istnieje interfejs API do pobierania żądanych informacji, wywołaj SHGetSpecialFolderPath(...,CSIDL_PROFILE,...)

Anders
źródło
-3
$env:USERPROFILE = "C:\\Documents and Settings\\[USER]\\"
Jeff
źródło
Spójrz na komentarze do pytania. Nie dotyczy to wszystkich wersji systemu Windows.
Wai Ha Lee,
-3

możesz użyć następującego kodu:

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

więcej informacji zobacz: Pobierz bieżącą ścieżkę do katalogu w WinXP i WinCE z C #

ksblog
źródło
3
To jest zupełnie nie na miejscu. OP pyta o bieżący folder użytkownika , a nie o folder roboczy.
julealgon