.NET und das Phantom-Backslash
Ich bin gerade dabei, einige meiner privat geschriebenen Tools für die Veröffentlichung aufzubereiten. Dabei fliegt man zwangsläufig über alten Code, der früher „für mich reichte“, heute aber ruhig ein paar Stufen aufgeräumter, robuster und veröffentlichungswürdig sein darf.
Aktuell überarbeite ich mein Tool Serienhelper – ein kleines, praktisches Helferlein, das Ordnerstrukturen von Serienverzeichnissen durchsucht und die darin enthaltenen Folgen mit Streamingseiten vergleicht. So lässt sich automatisch feststellen, ob neue Folgen verfügbar sind oder ob man bereits alles hat. Ziel ist es, Serien automatisch aktuell zu halten, ohne sich durch jede Website klicken zu müssen.
Während ich den Code aufräume, bin ich über ein Verhalten in .NET gestolpert, das auf den ersten Blick wie ein Bug wirkt – aber eigentlich eher ein Überbleibsel aus der DOS-Ära ist.
Ich wollte einfach nur alle Unterordner eines Netzlaufwerks auflisten, das als A:\
eingebunden ist:
string folderPath = "A:";
var subFolders = Directory.GetDirectories(folderPath);
Was ich erwartet habe:
A:\Ordnername
Was ich bekommen habe:
A:Ordnername
Kein Backslash. Kein Witz. Nur ein verwirrter Blick.
Was steckt dahinter?
Windows unterscheidet bei Pfaden mit Laufwerksbuchstaben ganz genau:
Pfad | Bedeutung |
---|---|
A: | aktuelles Arbeitsverzeichnis auf Laufwerk A |
A:\ | Root-Verzeichnis von Laufwerk A |
Wenn man Directory.GetDirectories("A:")
aufruft, interpretiert .NET das als relativen Pfad – bezogen auf das aktuelle Arbeitsverzeichnis auf Laufwerk A. Und deshalb bekommt man Pfade zurück wie A:Ordnername
, also ohne führenden Backslash.
Das wirkt komisch – ist aber technisch korrekt. Und ehrlich gesagt auch verdammt alt.
Wie man es richtig macht
Wenn du das Root-Verzeichnis des Netzlaufwerks A:
meinst (und nicht einen relativen Pfad), dann musst du das auch explizit sagen:
string folderPath = @"A:\";
var subFolders = Directory.GetDirectories(folderPath);
Dann bekommst du:
A:\Ordnername
Genau wie erwartet.
Fortgeschritten: Das aktuelle Verzeichnis auf einem anderen Laufwerk setzen
Falls du wirklich "A:"
verwenden willst, kannst du auch gezielt das aktuelle Arbeitsverzeichnis für Laufwerk A setzen – denn Windows speichert für jedes Laufwerk ein eigenes „aktuelles Verzeichnis“.
Beispiel:
// Auf das Laufwerk wechseln (damit Windows weiß, worum es geht)
Environment.CurrentDirectory = @"A:\";
// Dann ein neues Arbeitsverzeichnis auf A: setzen
Directory.SetCurrentDirectory(@"A:\Ordner");
// Ab jetzt zeigt "A:" auf "A:\Ordner"
var subFolders = Directory.GetDirectories("A:");
Das funktioniert genauso auch für C:
, D:
usw. – Windows behandelt jedes Laufwerk isoliert, was das aktuelle Verzeichnis betrifft.
Fazit
Das war kein Bug – aber ein schöner Stolperstein. Wer "A:"
statt "A:\"
schreibt, bekommt zwar gültige, aber irreführende Ergebnisse. Gerade bei Tools wie meinem Serienhelper, die mit vielen Pfaden und Netzlaufwerken jonglieren, kann ein unscheinbarer Fehler wie dieser schnell zu unerwartetem Verhalten führen.
Meine Empfehlung: Verwende immer vollständige, absolute Pfade mit Backslash. Der eine kleine Strich macht den Unterschied zwischen „funktioniert sofort“ und „was zum…?“
PS: Retro-Charme mit Nebenwirkungen
Dass Windows und .NET bis heute DOS-Konventionen wie „aktuelles Verzeichnis pro Laufwerk“ mit sich rumschleppen, ist irgendwie charmant. Aber auch gefährlich. Wie so vieles, was aus den 80ern kommt.