2009-07-16 7 views
60

Sử dụng này:Tôi có thể lấy thư mục người dùng hiện tại bằng cách nào?

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

tôi nhận được kết quả này:

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

Làm thế nào tôi có thể nhận được vào thư mục gốc của tất cả người dùng? ví dụ:

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

Câu trả lời tôi đã sử dụng đã bị xóa ... hoạt động này: Path.GetDirectoryName (Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData)) – juan

+1

Juan - điều đó không phải lúc nào cũng phù hợp với bạn - bạn vừa may mắn lần này . –

+0

tại sao vậy? bạn có nghĩa là như trong vista? hoặc trong xp nó đột nhiên sẽ ngừng hoạt động? – juan

Trả lời

34

Có thể đây sẽ là một giải pháp tốt: dùng trong tài khoản cho dù đây là Vista/Win7 hay XP và không sử dụng các biến môi trường:

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

Mặc dù sử dụng các biến môi trường là nhiều hơn nữa rõ ràng.

3

Hãy thử:

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

Điều này sẽ không hoạt động trên Windows 7, và tôi cho rằng sẽ không hoạt động trên vista nếu tôi nhớ cấu trúc thư mục đúng. Vào ngày 7, bạn phải đi lên 2 thư mục cha vì thư mục ApplicationData là \% userprofile% \ AppData \ Roaming \ –

+0

Trả về "C: \ Users \ Fredrik \ AppData" trên máy Vista của tôi (thư mục ApplicationData là " C: \ Users \ Fredrik \ AppData \ Roaming ") –

114

Hãy thử:

System.Environment.GetEnvironmentVariable("USERPROFILE"); 

Edit:

Nếu phiên bản của .NET bạn đang sử dụng là 4 hoặc cao hơn, bạn có thể sử dụng số Environment.SpecialFolder:

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); 
+11

Đó là một ý tưởng thực sự tồi tệ để phụ thuộc vào biến môi trường để cung cấp cho bạn đường dẫn thư mục. Có quá nhiều cách để biến môi trường có thể thay đổi. Cách được khuyến nghị là với liệt kê Environment.SpecialFolder. –

+1

Thật không may, như bạn có thể thấy http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx thư mục USERPROFILE không được chứa trong liệt kê đó. – Thomas

+0

Môi trường.SpecialFolder được bao gồm trong .NET 1.1, chỉ không có thư mục "UserProfile" ... – Vini

4
Environment.GetEnvironmentVariable("userprofile") 

Cố gắng điều hướng lên từ một SpecialFolder được đặt tên dễ bị sự cố. Có rất nhiều lý do khiến các thư mục không phải là nơi bạn mong đợi - người dùng có thể di chuyển chúng, GPO có thể di chuyển chúng, chuyển hướng thư mục sang đường dẫn UNC, v.v.

Sử dụng environment variable để cấu hình người dùng phải phản ánh bất kỳ vấn đề nào có thể xảy ra.

1

Rối tung xung quanh với các biến môi trường hoặc phụ huynh offsets thư mục mã hóa cứng không bao giờ là một ý tưởng tốt khi có một API để có được thông tin mà bạn muốn, hãy gọi SHGetSpecialFolderPath(...,CSIDL_PROFILE,...)

-3

bạn có thể sử dụng đoạn mã sau:

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

thông tin xem: Get Current Directory Path in both WinXP and WinCE with C#

+3

Điều này hoàn toàn không đúng chỗ tại đây. OP đang yêu cầu thư mục _user_ hiện tại, không phải thư mục làm việc. – julealgon

12

Bạn có thể lấy con đường với chỉ này UserProfile:

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

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

Hãy xem các nhận xét về câu hỏi. Đây không phải là trường hợp cho tất cả các phiên bản của Windows. –

3

Cũng rất hữu ích, trong khi điều tra Environment.SpecialFolder enum. Sử dụng LINQPad hoặc tạo ra một giải pháp và thực thi mã này:

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

Folder Paths

Đây là kết quả trên máy tính của tôi:

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 

Btw."fisch" là 5 chữ cái đầu tiên của họ của tôi (và là tiếng Đức cho "cá"). Đây là tên người dùng được chỉ định khi đăng nhập bằng Tài khoản Microsoft.

+0

Tôi không biết làm thế nào tôi chưa bao giờ nghe nói về LINQPad, đã thử nó, điều này là rất tốt, cảm ơn cho giới thiệu nó. – TravisO