Lấy đường dẫn của thư mục chính trong C #?


101

Được rồi, tôi đã kiểm tra Environment.SpecialFolder, nhưng không có gì trong đó cho việc này.

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

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 làm đ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 hơn là sử dụng mscorlib) không?

CẬP NHẬT : Được rồi, đây là mã tôi đã sử dụng:

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

2
BÙM. Súng nhanh nhất ở phương Tây: P
Boris Callens

Không hiểu 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

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

1
Tôi nghĩ bạn nên đưa kết quả vào một câu trả lời, lần sau.
Peteter

PlatformID.MacOSX không cần thiết, PlatformID.Unix cũng trả về true trên MacOSX (hoặc ít nhất là nó đã từng).
Stefan Steiger

Câu trả lời:


51

Environment.SpecialFolder.Personalkhông thực sự trả về thư mục chính, nó 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ễ thực hiện (trên Unix và Windows), vì vậy tôi không chắc tại sao người đăng muốn không làm điều đó.

Đã chỉnh sửa để thêm: Đối với C # (Windows / Unix) crossplatform, tôi đã đọc $HOMEtrên Unix và OSX và %HOMEDRIVE%%HOMEPATH%trên Windows.


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

Matthew, bạn nói đúng. Tôi đã thêm một lời giải thích trên bình luận ban đầu.
sigint

12
Bạn có thể không sử dụng% USERPROFILE% trên Windows không?
Lucas Jones

1
$ HOME cũng hoạt động trên OS X. Đây vẫn không phải là câu trả lời chính xác theo như tôi lo ngại vì bạn đang thực hiện phát hiện nền tảng ... nhưng để đạt được các giá trị chính xác được yêu cầu, đó là những gì bạn phải làm.
Matthew Scharley

2
person-b,% USERPROFILE% và% HOMEDRIVE %% HOMEPATH% thường giống nhau trên các PC cá nhân, nhưng thường trỏ đến các vị trí khác nhau trong môi trường được nối mạng. Ví dụ: tại nơi làm việc USERPROFILE của tôi là C: \ Documents and Settings \ username nhưng thư mục chính là Z: \, là một ổ đĩa nối mạng được CNTT sao lưu thường xuyên.
sigint

92
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)

Cá nhân là Tài liệu của tôi (hoặc Tài liệu trong win7 trở lên).


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 API win32 bằng tay với giá trị 40 cho UserProfile
linquize

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

1
Đừng quên sử dụng System.IO.Path.DirectorySeparatorChar để xây dựng đường dẫn tệp của bạn nhằm giữ cho tệp di động.
thomiel

4
Không sử dụng DirectorySeperatorChar theo cách thủ công. Sử dụng Path.Combine.
John Gietzen

14

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ó được chứa trong infact mscorlib.


Điều đó trả về thư mục Tài liệu của tôi.
MiffTheFox

"My Documents" thứ gần nhất mà Windows có trong thư mục chính.
MSalters

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

Không hẳn ... nhưng giải pháp thay thế là PInvoke và OP đã yêu cầu một giải pháp được quản lý.
Matthew Scharley

7
Lưu ý rằng Environment.SpecialFolder.UserProfile có sẵn trong .NET 4.0, đó là những gì bạn muốn
linquize

8

Trong DotNetCore 1.1 System.Environment.SpecialFolderkhông tồn tại. Nó có thể tồn tại trong phiên bản 2.0-beta. Cho đến lúc đó, để thực hiện việc này, bạn có thể sử dụng các cách sau:

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

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

4

Câu trả lời mấu chốt 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 mà chúng ta có thể mong đợi một 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 thành mã cụ thể của hệ điều hành.


1

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 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 thư mục chính nếu bạn đang chạy trên hệ điều hành không phải Windows.

Trang web này dường như cung cấp một cách để thực hiện những gì bạn cần trong Windows.


Trừ khi bạn đang sử dụng một số triển khai braindead của Framework Environment.GetFolder () sẽ hoạt động trên nhiều nền tảng.
R. Martinho Fernandes

2
Nên . Việc triển khai của MS không làm được điều đó.
R. Martinho Fernandes

1

Điều này có thể được thực hiện bằng GetEnvironmentVariabletrong System.IO:

public string GetUserHome() {
    var homeDrive = Environment.GetEnvironmentVariable("HOMEDRIVE");
    if (!string.IsNullOrWhiteSpace(homeDrive))
    {
        var homePath = Environment.GetEnvironmentVariable("HOMEPATH");
        if (!string.IsNullOrWhiteSpace(homePath))
        {            
            var fullHomePath = homeDrive + Path.DirectorySeparatorChar + homePath;
            return 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ác 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 thành công vì nó tạo ra: \\Users\\myusername\\myFolder


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.