Bagaimana saya bisa mendapatkan direktori pengguna saat ini?

100

Menggunakan ini:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

Saya mendapatkan keluaran ini:

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

Bagaimana saya bisa mendapatkan direktori root dari semua pengguna? yaitu:

"C:\\Documents and Settings\\[USER]\\"
juan
sumber
1
Jawaban yang akhirnya saya gunakan telah dihapus ... ini berfungsi: Path.GetDirectoryName (Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData))
juan
2
Juan - itu tidak selalu berhasil untuk Anda - Anda hanya beruntung kali ini.
Scott Ivey
mengapa demikian? maksudmu seperti di vista? atau di xp tiba-tiba akan berhenti bekerja?
juan
5
lihat komentar Scott tentang jawaban Jay Riggs. Di W7 dan Vista, folder Data Aplikasi berada di tempat yang berbeda, jadi Anda harus naik 2 direktori, bukan 1.
Thomas

Jawaban:

48

Mungkin ini akan menjadi solusi yang baik: dengan mempertimbangkan apakah ini Vista / Win7 atau XP dan tanpa menggunakan variabel lingkungan:

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

Padahal menggunakan variabel lingkungan jauh lebih jelas.

Anton Kolesov
sumber
165

Mencoba:

System.Environment.GetEnvironmentVariable("USERPROFILE");

Edit:

Jika versi .NET yang Anda gunakan adalah 4 atau lebih tinggi, Anda dapat menggunakan Environment.SpecialFolderpencacahan:

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
Thomas
sumber
16
Ide yang sangat buruk untuk bergantung pada variabel lingkungan untuk memberi Anda jalur folder. Ada terlalu banyak cara untuk mengubah variabel lingkungan tersebut. Cara yang direkomendasikan adalah dengan enumerasi Environment.SpecialFolder.
Jim Mischel
1
Sayangnya, seperti yang Anda lihat msdn.microsoft.com/en-us/library/… folder USERPROFILE tidak terdapat dalam pencacahan itu.
Thomas
Environment.SpecialFolder disertakan dari .NET 1.1, hanya saja tidak memiliki folder "UserProfile" ...
Vini
@JimMischel Tapi bukankah itu seharusnya bisa diubah? Dan jika Anda selalu mengacu pada variabel lingkungan, Anda baik-baik saja.
Nate-Wilkins
22

Anda bisa mendapatkan jalur UserProfile hanya dengan ini:

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

zionyx
sumber
11

Juga sangat membantu, saat menyelidiki Environment.SpecialFolderenum. Gunakan LINQPad atau buat solusi dan jalankan kode ini:

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

Jalur Folder

Ini adalah hasil di mesin saya:

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" adalah 5 huruf pertama dari nama belakang saya. Ini adalah nama pengguna yang diberikan saat masuk dengan Akun Microsoft.)

bytecode77
sumber
Saya tidak tahu bagaimana saya belum pernah mendengar tentang LINQPad, mencobanya, hal ini hebat, terima kasih telah merekomendasikannya.
TravisO
4
Environment.GetEnvironmentVariable("userprofile")

Mencoba menavigasi ke atas dari SpecialFolder yang bernama rentan terhadap masalah. Ada banyak alasan mengapa folder tidak berada di tempat yang Anda harapkan - pengguna dapat memindahkannya sendiri, GPO dapat memindahkannya, pengalihan folder ke jalur UNC, dll.

Menggunakan variabel lingkungan untuk profil pengguna harus mencerminkan salah satu dari kemungkinan masalah tersebut.

Scott Ivey
sumber
3

Mencoba:

System.IO.Directory.GetParent(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)).FullName/
Jay Riggs
sumber
1
Ini tidak akan berfungsi pada Windows 7, dan saya berasumsi tidak akan berfungsi pada vista baik jika saya mengingat struktur folder dengan benar. Pada tanggal 7, Anda harus membuka 2 folder induk karena folder ApplicationData adalah \% userprofile% \ AppData \ Roaming \
Scott Ivey
Itu mengembalikan "C: \ Users \ Fredrik \ AppData" di mesin Vista saya (folder ApplicationData adalah "C: \ Users \ Fredrik \ AppData \ Roaming")
Fredrik Mörk
-3
$env:USERPROFILE = "C:\\Documents and Settings\\[USER]\\"
Jeff
sumber
Silahkan lihat di komentar atas pertanyaan tersebut. Ini tidak berlaku untuk semua versi Windows.
Wai Ha Lee
-3

Anda dapat menggunakan kode berikut:

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

informasi lebih lanjut lihat: Dapatkan Jalur Direktori Saat Ini di WinXP dan WinCE dengan C #

ksblog.dll
sumber
3
Ini benar-benar tidak pada tempatnya di sini. OP meminta folder pengguna saat ini , bukan folder kerja.
julealgon