2016-05-19 19 views
7

In C# System.IO.DriveInfo hat die Eigenschaft DriveType.Welche Art von Laufwerk ist "NoRootDirectory" (System.IO.DriveType.NoRootDirectory)?

System.IO.DriveType ist eine Enumeration:

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, 
} 

Ich vermute, dass dies ein Volumen ohne Laufwerksbuchstaben. Aber mit:

System.IO.DriveInfo.GetDrives(); 

nicht mein Volumen ohne Laufwerksbuchstabe.

Wird NoRootDirectory für jede andere Art von Volumes/Laufwerken verwendet oder zeigt System.IO.DriveInfo.GetDrives() sie einfach nicht?

+0

Ich weiß, dass es für nicht zugewiesene Laufwerksbuchstaben verwendet wird. Sie werden sie natürlich nicht durch 'GetDrives' bringen, aber versuchen' 'neues System.IO.DriveInfo (" B: "). DriveType' oder ähnliches. Es könnte auch für unformatierte Partitionen (oder unbekannte Dateisysteme) verwendet werden, aber ich bin mir nicht ganz sicher (Sie müssten testen, ob Sie in diesem Fall "Unbekannt" oder "NoRootDirectory" erhalten). Der Vollständigkeit halber könnten Sie auch Müll-Laufwerke erstellen, indem Sie zu 'HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ DOS Devices' gehen und ein Laufwerk' X: 'erstellen, das zum Beispiel auf' \ Device \ Null 'zeigt und Sie sehen, was Sie bekommen für diejenigen. – CherryDT

+0

Eigentlich ist die [Dokumentation für die zugrunde liegende WinAPI-Funktion 'GetDriveType'] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa364939 (v = vs.85) .aspx) ein bisschen klarer. Darin heißt es: "Der Root-Pfad ist ungültig; es wird beispielsweise kein Volume am angegebenen Pfad bereitgestellt." – CherryDT

+0

Ich würde übersetzen "der Root-Pfad ist ungültig" als "Der Kernel-Pfad' \ DosDevices \ X: 'nicht auflösen/verknüpfen mit einem gültigen Dateisystem-Verzeichnis-Objekt in der Lage, eine Anfrage für den Pfad' \ 'zu lösen." - Wahrscheinlich wurde der Satz von jemandem mit Windows-Kernel-Wissen geschrieben. In diesem Fall würde ich annehmen, dass meine "Müll-Laufwerke" von oben Ihnen auch diesen Wert sowie alle nicht zugewiesenen Laufwerksbuchstaben geben würden. – CherryDT

Antwort

4

System.IO.DriveType.NoRootDirectory scheint für "ist zur Laufwerksbuchstaben nicht verwendete" eine misleadingly Bezeichnung zu sein

Testcode für alle Antriebe: Alle nicht gefunden Antriebe haben den Typ 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()); 
} 

Ergebnis:

// 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 

ehemalige Beispiel (vor diesen Beitrag bearbeiten):

Aber: Dies ist nur ein Fall, in dem gefunden NoRootDirectory verwendet wird. Es beantwortet nicht die Frage, ob es andere Konstellationen gibt, wo es gezeigt wird.

Hier ist der Testcode:

// 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 

Ich habe einige weitere Kombinationen mit verwendet getestet, jedoch nicht mehr vorhanden Laufwerke, aber keiner von ihnen zurück NoRootDirectory.

+0

@HansPassant Das habe ich getestet. Sieh dir den Schnitt an. – boboes

+0

Wie verhält sich das, wenn eine Partition in einem Ordner in NTFS bereitgestellt wird? –

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

Willkommen bei Stack Overflow! Vielen Dank für dieses Code-Snippet, das sofortige Hilfe bieten kann. Eine richtige Erklärung [würde erheblich verbessern] (// meta.stackexchange.com/q/114762) ihren pädagogischen Wert, indem sie * warum * dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit ähnlichen, nützlicher machen würde, aber nicht identisch, Fragen. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erläuterung hinzuzufügen und geben Sie an, welche Einschränkungen und Annahmen gelten. –