2016-05-19 14 views
7

Trong C# System.IO.DriveInfo có thuộc tính DriveType.Loại ổ đĩa nào là "NoRootDirectory" (System.IO.DriveType.NoRootDirectory)?

System.IO.DriveType là một enum:

public enum DriveType 
{ 
    Unknown = 0, 
    // 
    // Summary: 
    //  The drive does not have a root directory. 
    NoRootDirectory = 1, 
    Removable = 2, 
    Fixed = 3, 
    Network = 4, 
    CDRom = 5, 
    Ram = 6, 
} 

tôi nghi ngờ rằng đây là một khối lượng mà không có một ký tự ổ đĩa. Nhưng sử dụng:

System.IO.DriveInfo.GetDrives(); 

không liệt kê ổ đĩa của tôi không có ký tự ổ đĩa.

Có phải NoRootDirectory được sử dụng cho bất kỳ loại ổ đĩa/ổ đĩa nào khác hoặc không System.IO.DriveInfo.GetDrives() không hiển thị chúng?

+0

Tôi biết rằng nó được sử dụng cho các ký tự ổ đĩa chưa được gán. Tất nhiên, bạn sẽ không nhận được chúng thông qua 'GetDrives' nhưng thử' System.IO.DriveInfo mới ("B:"). DriveType' hoặc như vậy. Nó có thể được sử dụng cho các phân vùng chưa định dạng (hoặc hệ thống tập tin không xác định), nhưng tôi không hoàn toàn chắc chắn (bạn sẽ phải kiểm tra xem bạn có được 'Unknown' hoặc' NoRootDirectory' trong trường hợp đó). Để hoàn thành, bạn cũng có thể tạo ổ đĩa rác bằng cách vào 'HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ DOS Devices' và tạo một ổ đĩa' X: 'trỏ tới' \ Device \ Null' chẳng hạn và xem những gì bạn nhận được cho những người. – CherryDT

+0

Trên thực tế, [tài liệu cho hàm WinAPI cơ bản 'GetDriveType'] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa364939 (v = vs.85) .aspx) là một chút rõ ràng hơn. Nó nói: "Đường dẫn gốc không hợp lệ, ví dụ, không có ổ đĩa nào được gắn ở đường dẫn được chỉ định." – CherryDT

+0

Tôi sẽ dịch "đường dẫn gốc không hợp lệ" là "Đường dẫn hạt nhân' \ DosDevices \ X: 'không giải quyết/liên kết đến đối tượng thư mục hệ thống tệp hợp lệ có thể giải quyết yêu cầu cho đường dẫn' \ '." - Có lẽ câu được viết bởi ai đó với kiến ​​thức hạt nhân Windows. Trong trường hợp này, tôi giả sử rằng "ổ đĩa rác" của tôi ở trên cũng sẽ cung cấp cho bạn giá trị này, cũng như bất kỳ ký tự ổ đĩa chưa được gán nào. – CherryDT

Trả lời

4

System.IO.DriveType.NoRootDirectory có vẻ là một định sai lạc cho "ký tự ổ đĩa này là không sử dụng"

Testcode cho tất cả các ổ đĩa: ổ đĩa Tất cả không tìm thấy có các loại DriveType.NoRootDirectory

foreach (char driveLetter in "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToArray()) 
{ 
    var driveInfo = new System.IO.DriveInfo(driveLetter.ToString() + ":\\"); 

    if(System.IO.DriveInfo.GetDrives().FirstOrDefault(o => o.Name[0] == driveLetter) == null) 
     Console.WriteLine("// Not found: " + driveInfo.Name + " has DriveType: " + driveInfo.DriveType.ToString()); 
    else 
     Console.WriteLine("//  found: " + driveInfo.Name + " has DriveType: " + driveInfo.DriveType.ToString()); 
} 

Kết quả:

// Not found: A:\ has DriveType: NoRootDirectory 
// Not found: B:\ has DriveType: NoRootDirectory 
//  found C:\ has DriveType: Fixed 
//  found D:\ has DriveType: CDRom 
// Not found: E:\ has DriveType: NoRootDirectory 
// Not found: F:\ has DriveType: NoRootDirectory 
// Not found: G:\ has DriveType: NoRootDirectory 
// Not found: H:\ has DriveType: NoRootDirectory 
// Not found: I:\ has DriveType: NoRootDirectory 
// Not found: J:\ has DriveType: NoRootDirectory 
// Not found: K:\ has DriveType: NoRootDirectory 
// Not found: L:\ has DriveType: NoRootDirectory 
// Not found: M:\ has DriveType: NoRootDirectory 
// Not found: N:\ has DriveType: NoRootDirectory 
// Not found: O:\ has DriveType: NoRootDirectory 
//  found P:\ has DriveType: Network 
// Not found: Q:\ has DriveType: NoRootDirectory 
//  found R:\ has DriveType: Network 
//  found S:\ has DriveType: Network 
// Not found: T:\ has DriveType: NoRootDirectory 
// Not found: U:\ has DriveType: NoRootDirectory 
//  found V:\ has DriveType: Network 
//  found W:\ has DriveType: Fixed 
//  found X:\ has DriveType: Network 
//  found Y:\ has DriveType: Network 
//  found Z:\ has DriveType: Network 

Cựu dụ (trước khi chỉnh sửa bài đăng này):

Nhưng: Đây chỉ là một trường hợp tìm thấy trong đó NoRootDirectory được sử dụng. Nó không trả lời câu hỏi liệu có các chòm sao khác nơi nó sẽ được hiển thị hay không.

Ở đây mã kiểm tra:

// J:\ is an unused drive letter 
var xDummy1 = new System.IO.DriveInfo("J:\\"); 
Console.WriteLine(xDummy1.Name);      // result: J:\ 
Console.WriteLine(xDummy1.DriveType);     // result: NoRootDirectory 
Console.WriteLine(xDummy1.IsReady);      // result: False 
// Console.WriteLine(xDummy1.DriveFormat); // would throw an DriveNotFoundException 
Console.WriteLine(System.IO.Directory.Exists("j:\\")); // result: False 


// S:\ is an mapped drive to a currently not available share 
var xDummy2 = new System.IO.DriveInfo("S:\\");   
Console.WriteLine(xDummy2.Name);      // result: S:\ 
Console.WriteLine(xDummy2.DriveType);     // result: Network 
Console.WriteLine(xDummy2.IsReady);      // result: False 
// Console.WriteLine(xDummy2.DriveFormat); // would throw an IOException 
Console.WriteLine(System.IO.Directory.Exists("S:\\")); // result: False 

tôi đã thử nghiệm một số kết hợp nhiều hơn với sử dụng, nhưng không có mặt ổ đĩa, nhưng không ai trong số họ trở NoRootDirectory.

+0

@ HansPassant Đây là những gì tôi đã thử nghiệm. Nhìn vào bản chỉnh sửa. – boboes

+0

Cách này hoạt động như thế nào khi đối mặt với một phân vùng được gắn vào một thư mục trong NTFS? –

0
//Check fixed local drive 
string path= "C\MyFolder\myfile.txt"; 
string root = Path.GetPathRoot(path); 

if (DriveInfo.GetDrives().FirstOrDefault(d => d.Name == root).DriveType == DriveType.Fixed) 
{ 
    MessageBox.Show(root); 
} 
+4

Chào mừng bạn đến với Stack Overflow! Cảm ơn bạn về đoạn mã này, đoạn mã này có thể cung cấp một số trợ giúp ngay lập tức. Một lời giải thích thích hợp [sẽ cải thiện rất nhiều] (// meta.stackexchange.com/q/114762) giá trị giáo dục của nó bằng cách hiển thị * tại sao * đây là một giải pháp tốt cho vấn đề, và sẽ hữu ích hơn cho các độc giả tương lai tương tự, nhưng không giống nhau, câu hỏi. Vui lòng [sửa] câu trả lời của bạn để thêm giải thích và đưa ra chỉ dẫn về những giới hạn và giả định được áp dụng. –

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