2009-07-17 43 views
76

Được rồi, tôi đã kiểm tra Environment.SpecialFolder, nhưng không có gì trong đó cho điều này.Lấy đường dẫn của thư mục chính trong C#?

Tôi muốn nhận thư mục chính của người dùng hiện tại trong C#. (ví dụ: c:\documents and settings\user trong XP, c:\users\user trong Vista và /home/user trong Unix.)

Tôi biết tôi có thể đọc các biến môi trường để tìm ra điều này, nhưng tôi muốn thực hiện điều này theo cách đa nền tảng.

Có cách nào tôi có thể làm điều này với .NET (tốt nhất là sử dụng mscorlib)?

CẬP NHẬT: Được rồi, đây là mã tôi đã kết thúc bằng:

string homePath = (Environment.OSVersion.Platform == PlatformID.Unix || 
        Environment.OSVersion.Platform == PlatformID.MacOSX) 
    ? Environment.GetEnvironmentVariable("HOME") 
    : Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%"); 
+2

BOOM. Súng nhanh nhất ở phía tây: P –

+0

Dunno về máy của bạn, nhưng trên hộp XP của tôi% HOMEDRIVE %% HOMEPATH% là một thư mục mạng, không phải c: \ Documents and Settings \ user \ MSalters \ – MSalters

+0

Thành thật mà nói, tôi xem xét chính xác điều này vấn đề là một underimplementation của .NET ... bạn nên xem tài liệu hướng dẫn cho CSIDLS (http://msdn.microsoft.com/en-us/library/bb762494.aspx) để xem danh sách đầy đủ những gì Windows hỗ trợ: Những gì bạn đang thực sự tìm kiếm là CSIDL_PROFILE, được hỗ trợ trong Windows, nhưng không phải bởi .NET vì một số lý do không thể hiểu được. –

Trả lời

40

Environment.SpecialFolder.Personal không thực sự trả về thư mục chính, thư này trả về thư mục Tài liệu của tôi. Cách an toàn nhất để lấy thư mục chính trên Win32 là đọc %HOMEDRIVE%%HOMEPATH%. Đọc các biến môi trường thực sự rất dễ sử dụng (trên Unix và Windows), vì vậy tôi không chắc tại sao poster lại muốn không làm điều đó.

Edited thêm: Đối crossplatform (Windows/Unix) C#, tôi muốn đọc $HOME trên Unix và OSX và %HOMEDRIVE%%HOMEPATH% trên Windows.

+0

Tôi biết một thực tế HOMEDRIVE không tồn tại trên * nix, và thông thường nó chỉ là HOME, không phải là HOMEPATH. –

+0

Matthew, bạn nói đúng. Tôi đã thêm một làm rõ về nhận xét ban đầu. – sigint

+0

+1 Đồng ý, đây là điều gần nhất mà chúng ta sẽ nhận được. – AnthonyWJones

9

Tôi tin rằng những gì bạn đang tìm kiếm là:

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

Để tham khảo, nó là Infact chứa trong mscorlib.

+0

Điều đó trả về thư mục My Documents. – MiffTheFox

+0

"Tài liệu của tôi" * là * điều gần nhất mà Windows có trong thư mục chính. – MSalters

+6

@MStallers Không,% HOMEDRIVE %% HOMEPATH% là. – MiffTheFox

0

Khi bạn nói cách đa nền tảng, bạn cần hỗ trợ những hệ điều hành nào khác? Bạn có thể cần phải thực hiện một số phát hiện hệ điều hành đơn giản để chọn phương pháp tìm kiếm thư mục chính nếu bạn đang chạy trên hệ điều hành không phải Windows.

This website dường như cung cấp cách để thực hiện những gì bạn cần trong Windows.

+0

Trừ khi bạn đang sử dụng một số thực hiện braindead của Framework Environment.GetFolder() nên làm việc đa nền tảng. –

+2

* Nên *. Việc triển khai của MS không làm điều đó. –

0

Tôi không có máy để kiểm tra, nhưng %HOMESHARE% có thể phù hợp với bạn. Nếu không, đây là một số khá tốt list of environment variables.

3

Câu trả lời cuối cùng là Không. Không có phương pháp dựa trên Hệ thống đơn giản nào trong .NET để lấy thư mục Chính để chúng tôi có thể mong đợi triển khai trong cả .NET trên Windows và trong Mono.

Bạn sẽ cần thực hiện một số phát hiện hệ điều hành và phân nhánh tới mã hệ điều hành cụ thể.

65
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); 

Cá nhân là tài liệu của tôi (hoặc Documents in win7).

+8

Lưu ý rằng UserProfile là mới trong .NET 4.0, nếu bạn sử dụng .NET 2.0/3.5, bạn phải gọi win32 API theo cách thủ công với giá trị 40 cho UserProfile – linquize

+0

Và "My Documents" không giống với thư mục chính, ngoại trừ Windows 95, 98 và ME. –

+1

Đừng quên sử dụng System.IO.Path.DirectorySeparatorChar để tạo đường dẫn tệp của bạn để giữ cho nó di động. – thomiel

0

Dự:

using System.IO; 
var homeDrive = Environment.GetEnvironmentVariable("HOMEDRIVE"); 
if (homeDrive != null) 
{ 
    var homePath = Environment.GetEnvironmentVariable("HOMEPATH"); 
    if (homePath != null) 
    {    
    var fullHomePath = homeDrive + Path.DirectorySeparatorChar + homePath; 
    FolderPath = 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'"); 
} 

Sau đó, nó tạo ra dưới cửa sổ: C:\\\\Users\\myusername\\myFolder

Lưu ý rằng nếu bạn sử dụng

var fullHomePath = Path.Combine(homeDrive.ToString(), homePath.ToString()) 

nó không gây ra nó tạo ra: \\Users\\myusername\\myFolder

4

Trong DotNetCore 1.1 System.Environment.SpecialFolder không exi st. Nó có thể tồn tại trong 2,0-beta. Cho đến lúc đó, để thực hiện việc này, bạn có thể sử dụng các mục sau:

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

Tôi đang sử dụng 2.0 và 'System.Environment.SpecialFolder' tồn tại – snotyak

Các vấn đề liên quan