Créer un dossier s'il n'existe pas en C# : comment ne pas ralentir le code

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi la question « créer un dossier s'il n'existe pas » est devenue un mème en C#

\n\n

Si vous avez déjà écrit du code qui sauvegarde des fichiers, traite des rapports ou met en cache des données, vous avez sûrement été confronté à la situation : « et si le dossier n'existe pas ? ». Cela semble simple, non ? On vérifie, on crée. Mais en pratique, cette tâche se transforme en un véritable parcours du combattant avec des bugs, des ralentissements et des exceptions.

\n\n

Sur Stack Overflow, la question « If a folder does not exist, create it » a accumulé des centaines de milliers de vues. Et ce n'est pas un hasard. Même les développeurs expérimentés écrivent parfois du code qui semble fonctionner, mais qui tue les performances ou plante dans des scénarios multithreads.

\n\n

Dans cet article, nous allons voir comment créer correctement un dossier en C# s'il n'existe pas, sans tomber dans les pièges. Vous découvrirez pourquoi Directory.CreateDirectory n'est pas simplement « crée », mais un outil d'optimisation puissant, et comment écrire du code qui ne ralentit pas, même sur des disques lents.

\n\n

L'approche la plus courante (et incorrecte)

\n\n

Lorsqu'un débutant rencontre ce problème, il écrit généralement quelque chose comme :

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

À première vue, c'est logique. On vérifie que le dossier n'existe pas, on le crée. Mais regardons ce qui se passe sous le capot.

\n\n

Problème n°1 : Double appel au système de fichiers

\n

Directory.Exists effectue une requête au système de fichiers. Directory.CreateDirectory en effectue une autre (ou plusieurs). Au final, on accède deux fois au disque. Sur un SSD, ce n'est pas critique, mais sur des dossiers réseau ou des HDD lents, chaque opération supplémentaire est une perte de millisecondes. Et si vous avez des centaines de ces vérifications ?

\n\n

Problème n°2 : Condition de concurrence (race condition)

\n

Imaginez que deux threads exécutent ce code simultanément. Les deux vérifient — le dossier n'existe pas. Les deux tentent de le créer. L'un réussit, l'autre plante avec une IOException (« Le dossier existe déjà »). Ou pire, les deux créent, mais l'un écrase les droits d'accès définis par l'autre.

\n\n

Problème n°3 : Faux sentiment de sécurité

\n

Beaucoup pensent : « J'ai vérifié, donc tout va bien ». Mais entre la vérification et la création, une microseconde peut s'écouler, pendant laquelle un autre processus crée ce dossier. Ou l'antivirus bloque la création. Ou l'espace disque est insuffisant.

\n\n

L'approche correcte : Directory.CreateDirectory est votre ami

\n\n

Et voici la surprise : la documentation Microsoft indique clairement que Directory.CreateDirectory vérifie lui-même si le dossier existe. S'il existe, il ne fait rien (il retourne un objet DirectoryInfo pour le dossier existant). S'il n'existe pas, il le crée.

\n\n

Autrement dit, tout le bloc avec if est superflu ! Il suffit simplement de :

\n\n
Directory.CreateDirectory(path);\n
\n\n

C'est non seulement plus court, mais aussi plus performant et plus sûr dans un environnement multithread. La méthode est atomique du point de vue du système de fichiers : soit elle crée le dossier, soit elle s'assure qu'il existe déjà, et rend la main.

\n\n

Pourquoi est-ce plus rapide ?

\n

Parce qu'à l'intérieur, CreateDirectory utilise la fonction WinAPI CreateDirectory, qui, si le dossier existe, retourne simplement ERROR_ALREADY_EXISTS. Pas de parcours de répertoire inutile. Un seul appel système au lieu de deux.

\n\n

Plongée en profondeur : comment fonctionne Directory.CreateDirectory

\n\n

Regardons le code réel. La méthode ne crée pas seulement le dossier final, mais aussi tous les répertoires parents dans le chemin. C'est une raison de plus pour ne pas écrire votre propre logique.

\n\n
string path = @"C:\\Projects\\Reports\\2025\\January\\Data";\nDirectory.CreateDirectory(path);\n// Si C:\\Projects n'existe pas — il le crée.\n// Si Reports n'existe pas — il le crée.\n// Et ainsi de suite, jusqu'à Data.\n
\n\n

Sans cela, vous devriez décomposer le chemin de manière récursive et créer

Blogs

Book Recommendations