2009-05-26 30 views
11

Tôi biết rằng những điều sau đây nên làm việc là gì:cách an toàn nhất để lấy Hệ thống lái

Environment.GetEnvironmentVariable("windir", EnvironmentVariableTarget.Machine) 

Vấn đề của tôi với cuộc gọi này là nếu vì một lý do một ai đó quyết định để loại bỏ các "windir" Env Var , điều này sẽ không hoạt động.

Có cách nào an toàn hơn để có được ổ đĩa Hệ thống không?

Trả lời

4

Một điều tôi thực sự có thể hiểu lầm là bạn muốn Drive hệ thống, nhưng bằng cách sử dụng "windir" bạn sẽ nhận được thư mục windows. Vì vậy, nếu bạn cần cách an toàn để lấy thư mục cửa sổ, bạn nên sử dụng chức năng API cũ GetWindowsDirectory.

Đây là chức năng được chuẩn bị để sử dụng C#. ;-)

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
    static extern uint GetWindowsDirectory(StringBuilder lpBuffer, uint uSize); 

    private string WindowsDirectory() 
    { 
     uint size = 0; 
     size = GetWindowsDirectory(null, size); 

     StringBuilder sb = new StringBuilder((int)size); 
     GetWindowsDirectory(sb, size); 

     return sb.ToString(); 
    } 

Vì vậy, nếu bạn thực sự cần ổ đĩa mà Windows đang chạy, bạn sau đó có thể gọi

System.IO.Path.GetPathRoot(WindowsDirectory()); 
+0

Hey, đó là những gì tôi đã nói! –

+0

@Richard: Đúng vậy, nhưng thay vì chỉ trỏ đến hướng cụ thể, tôi đã thêm một mẫu, về cách sử dụng chức năng này. – Oliver

0

Theres một biến môi trường được gọi là SystemDrive

C:\>SET SystemDrive 
SystemDrive=C: 
+0

Thật không may, phương pháp đó cũng gặp vấn đề tương tự như WinD gốc ir biến môi trường - người dùng có thể tùy ý thay đổi hoặc xóa nó khỏi môi trường của họ. –

8

Cái này trả về đường dẫn đến thư mục hệ thống (system32).

Environment.GetFolderPath(Environment.SpecialFolder.System) 

Bạn có thể sử dụng điều đó, sau đó bạn không cần phải dựa vào biến môi trường.

+0

Điều đáng chú ý là GetFolderPath phấn khởi lo ngại về biến môi trường của bạn vì nó sử dụng SHGetFolderPath trong nội bộ. –

17
string windir = Environment.SystemDirectory; // C:\windows\system32 
string windrive = Path.GetPathRoot(Environment.SystemDirectory); // C:\ 

Lưu ý: Thuộc tính này sử dụng nội bộ API GetSystemDirectory() Win32. Nó không dựa vào các biến môi trường.

1

Chưa bao giờ đọc các biến môi trường (bất kỳ kịch bản hoặc người dùng có thể thay đổi chúng!)
Phương thức chính thức (nội bộ MS, được sử dụng bởi Explorer) là câu hỏi thường gặp về Win32 api trong nhiều thập kỷ (xem các nhóm Google, Win32, Hệ thống api)