Pourquoi la question « créer un dossier s'il n'existe pas » est devenue un mème en C#
\n\nSi 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\nSur 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\nDans 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.
L'approche la plus courante (et incorrecte)
\n\nLorsqu'un débutant rencontre ce problème, il écrit généralement quelque chose comme :
\n\nif (!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\nProblème n°1 : Double appel au système de fichiers
\nDirectory.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 ?
Problème n°2 : Condition de concurrence (race condition)
\nImaginez 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.
Problème n°3 : Faux sentiment de sécurité
\nBeaucoup 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\nL'approche correcte : Directory.CreateDirectory est votre ami
\n\nEt 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.
Autrement dit, tout le bloc avec if est superflu ! Il suffit simplement de :
Directory.CreateDirectory(path);\n\n\nC'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\nPourquoi est-ce plus rapide ?
\nParce 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.
Plongée en profondeur : comment fonctionne Directory.CreateDirectory
\n\nRegardons 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\nstring 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\nSans cela, vous devriez décomposer le chemin de manière récursive et créer