Ordner erstellen, falls nicht vorhanden in C#: Wie man den Code nicht ausbremst

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum die Frage „Ordner erstellen, falls nicht vorhanden“ ein Meme in C# geworden ist



Wenn Sie jemals Code geschrieben haben, der Dateien speichert, Berichte verarbeitet oder Daten zwischenspeichert, sind Sie bestimmt auf die Situation gestoßen: „Was, wenn der Ordner nicht existiert?“. Es scheint einfach: Prüfen – Erstellen. Aber in der Praxis wird diese Aufgabe zu einer echten Herausforderung mit Bugs, Verlangsamungen und Ausnahmen.



Auf Stack Overflow hat die Frage „If a folder does not exist, create it“ Hunderttausende von Aufrufen. Und das ist kein Zufall. Selbst erfahrene Entwickler schreiben manchmal Code, der zwar funktioniert, aber die Leistung tötet oder in Multithread-Szenarien abstürzt.



In diesem Artikel analysieren wir, wie man in C# einen Ordner korrekt erstellt, falls er nicht existiert, ohne in die Fallen zu tappen. Sie erfahren, warum Directory.CreateDirectory nicht nur „erstellen“ ist, sondern ein leistungsstarkes Optimierungswerkzeug, und wie Sie Code schreiben, der selbst auf langsamen Festplatten nicht ausbremst.



Der häufigste (und falsche) Ansatz



Wenn ein Anfänger zum ersten Mal auf die Aufgabe stößt, schreibt er normalerweise so etwas wie:



if (!Directory.Exists(path)){    Directory.CreateDirectory(path);}


Auf den ersten Blick – logisch. Geprüft, dass der Ordner nicht existiert, erstellt. Aber schauen wir uns an, was unter der Haube passiert.



Problem Nr. 1: Doppelter Aufruf des Dateisystems

Directory.Exists führt eine Anfrage an das Dateisystem durch. Directory.CreateDirectory führt eine weitere (oder mehrere) Anfragen durch. Am Ende greifen wir zweimal auf die Festplatte zu. Auf einer SSD ist das nicht kritisch, aber bei Netzwerkordnern oder langsamen HDDs ist jede zusätzliche Operation ein Verlust von Millisekunden. Und wenn es Hunderte solcher Prüfungen gibt?



Problem Nr. 2: Race Condition

Stellen Sie sich vor, zwei Threads führen diesen Code gleichzeitig aus. Beide prüfen – der Ordner existiert nicht. Beide versuchen zu erstellen. Einer erstellt erfolgreich, der zweite stürzt mit IOException ab („Der Ordner existiert bereits“). Oder noch schlimmer, beide erstellen, aber einer überschreibt die vom anderen gesetzten Zugriffsrechte.



Problem Nr. 3: Falsches Sicherheitsgefühl

Viele denken: „Ich habe geprüft – also ist alles in Ordnung.“ Aber zwischen der Prüfung und der Erstellung kann eine Mikrosekunde vergehen, in der ein anderer Prozess diesen Ordner erstellt. Oder das Antivirenprogramm blockiert die Erstellung. Oder der Speicherplatz auf der Festplatte ist erschöpft.



Der richtige Ansatz: Directory.CreateDirectory – Ihr Freund



Und jetzt die Überraschung: Die Microsoft-Dokumentation sagt direkt, dass Directory.CreateDirectory selbst prüft, ob der Ordner existiert. Wenn er existiert – tut es nichts (gibt ein DirectoryInfo-Objekt für den vorhandenen Ordner zurück). Wenn nicht – erstellt es ihn.



Das heißt, der gesamte Block mit if ist überflüssig! Es reicht einfach:



Directory.CreateDirectory(path);


Das ist nicht nur kürzer, sondern auch leistungsfähiger und sicherer in einer Multithread-Umgebung. Die Methode ist aus Sicht des Dateisystems atomar: Sie erstellt entweder den Ordner oder stellt sicher, dass er bereits vorhanden ist, und gibt die Kontrolle zurück.



Warum ist das schneller?

Weil CreateDirectory intern die WinAPI-Funktion CreateDirectory verwendet, die im Falle eines vorhandenen Ordners einfach ERROR_ALREADY_EXISTS zurückgibt. Kein unnötiges Durchlaufen des Verzeichnisses. Ein Systemaufruf statt zwei.



Tiefergehende Betrachtung: Wie Directory.CreateDirectory funktioniert



Schauen wir uns den tatsächlichen Code an. Die Methode erstellt nicht nur den endgültigen Ordner, sondern auch alle übergeordneten Verzeichnisse im Pfad. Das ist ein weiterer Grund, keine eigene Logik zu schreiben.



string path = @"C:\\Projects\\Reports\\2025\\January\\Data";Directory.CreateDirectory(path);// Wenn C:\\Projects nicht existiert – wird es erstellt.// Wenn Reports nicht existiert – wird es erstellt.// Und so weiter, bis zu Data.


Ohne dies müssten Sie den Pfad rekursiv zerlegen und erst

Blogs

Buchempfehlungen