1. Introduction
Imaginez que vous écrivez un programme dans lequel l'utilisateur téléverse ses photos. Ce serait bien de les stocker pas juste en "tas" dans un seul dossier, mais de créer des répertoires séparés — par date ou par nom d'utilisateur. Ou, disons, votre programme génère des rapports : il est logique de mettre les résultats dans un répertoire dédié, qu'il faut aussi créer à la volée. Et supprimer les dossiers temporaires après le travail — c'est carrément le boulot d'un code propre (et un soulagement pour l'utilisateur pour éviter les déchets).
Travailler avec des répertoires est une tâche standard dans beaucoup d'applications : de la sauvegarde aux jeux qui veulent organiser leurs saves par dossiers. En entretien, ce sujet revient souvent, parce qu'il est important de comprendre non seulement qu'il existe une commande "créer" ou "supprimer", mais aussi comment elle se comporte dans des situations non standard.
Un répertoire (ou dossier) est, en substance, un conteneur pour d'autres fichiers et répertoires dans le système de fichiers. Les répertoires forment une structure arborescente (filesystem tree) : chaque dossier a un parent, sauf la racine, et peut avoir des dossiers enfants — même des milliers.
2. Comment créer un dossier ? La classe statique Directory
La façon la plus simple de créer un dossier est d'utiliser la méthode statique Directory.CreateDirectory. Pas besoin d'instancier des objets, il suffit de passer le chemin :
using System.IO;
// Nous créons le dossier "Reports" dans le répertoire courant
Directory.CreateDirectory("Reports");
Si un tel dossier existe déjà, la méthode ne fait rien et ne lance pas d'erreur — vous pouvez appeler CreateDirectory sans vous soucier de l'existence du dossier.
Essayons d'insérer un chemin plus complexe, par exemple créer un dossier imbriqué :
Directory.CreateDirectory(@"Data\Photos\2024\June");
Cet appel créera toute la chaîne de répertoires si certains dossiers intermédiaires n'existaient pas. On appelle ça la création récursive — Directory.CreateDirectory s'occupe de tout.
Important ! Dans les chemins de répertoires utilisez soit le double antislash (\\) pour Windows, soit le slash (/). Encore mieux — Path.Combine, dont on a déjà parlé.
Que retourne CreateDirectory ?
La méthode retourne un objet de type DirectoryInfo. C'est pratique si vous voulez travailler directement avec ce répertoire :
DirectoryInfo reportsDir = Directory.CreateDirectory("Reports");
Console.WriteLine($"Dossier créé : {reportsDir.FullName}");
Comment savoir si un dossier existe ?
Dans n'importe quelle situation où vous voulez faire une opération sur un répertoire, il est bien de s'assurer qu'il existe. Pour ça il y a la méthode statique :
bool exists = Directory.Exists("Reports");
if (!exists)
{
Console.WriteLine("Dossier introuvable, on va le créer !");
Directory.CreateDirectory("Reports");
}
Rappel : Il n'est pas obligatoire de faire une vérification préalable avant la création : la méthode ne cassera rien si le dossier existe. Mais si vous voulez afficher un joli message à l'utilisateur ou gérer la logique différemment, cette approche est utile.
3. Création de répertoires : cas pratiques
Mettons ces connaissances au service de notre application d'apprentissage. Supposons que nous tenions un registre des utilisateurs et voulions stocker pour chacun un dossier séparé :
// Ajoutons System.IO en haut du fichier, si ce n'est pas déjà fait
using System.IO;
Console.Write("Entrez le nom d'utilisateur : ");
string userName = Console.ReadLine() ?? "Unknown";
// Construisons le chemin du dossier utilisateur
string basePath = "UsersData";
string userPath = Path.Combine(basePath, userName);
// Créons le dossier pour l'utilisateur (et le parent si nécessaire)
Directory.CreateDirectory(userPath);
Console.WriteLine($"Le dossier pour l'utilisateur \"{userName}\" est prêt : {Path.GetFullPath(userPath)}");
L'exemple ci‑dessus créera la structure de fichiers (si elle n'existait pas) :
UsersData/
└── NomUtilisateur/
Conseil : utilisez toujours Path.Combine lorsque vous assemblez des morceaux de chemins — ainsi votre code fonctionnera sur Windows, Linux et Mac.
4. Comment supprimer un dossier ? La méthode Directory.Delete
Supprimer un dossier est presque aussi simple que le créer. Mais il y a des nuances.
Directory.Delete("Reports");
Si le dossier existe et est vide — il sera supprimé sans problème. Mais s'il contient quelque chose, une exception sera levée :
System.IO.IOException : "The directory is not empty."
Et si on doit supprimer le dossier avec son contenu ?
Il existe une surcharge de la méthode avec le paramètre recursive: true :
Directory.Delete("Reports", recursive: true);
ATTENTION : La suppression récursive détruit irrévocablement tout le contenu du dossier. Si vous indiquez le mauvais répertoire, vous pouvez perdre des données importantes. Vérifiez toujours deux fois le chemin !
Exemple
Ajoutons la possibilité de supprimer le dossier d'un utilisateur (par exemple si l'utilisateur supprime son compte) :
// On demande si l'on doit supprimer
Console.Write("Supprimer le dossier utilisateur ? (y/n) : ");
string input = Console.ReadLine() ?? "";
if (input.ToLower() == "y")
{
if (Directory.Exists(userPath))
{
// On supprime avec tout le contenu
Directory.Delete(userPath, recursive: true);
Console.WriteLine("Le dossier utilisateur a été supprimé !");
}
else
{
Console.WriteLine("Le dossier n'existe plus.");
}
}
5. Tableau : Méthodes principales pour travailler avec des dossiers
| Opération | Méthode | Particularités |
|---|---|---|
| Créer un dossier | |
Crée récursivement tous les dossiers du chemin |
| Vérifier l'existence | |
Retourne true ou false |
| Supprimer un dossier vide | |
Lance une erreur si le dossier n'est pas vide |
| Supprimer un dossier avec contenu | |
Efface irrémédiablement tout à l'intérieur |
| Obtenir la liste des fichiers | |
Renvoie les noms des fichiers |
| Obtenir la liste des sous-dossiers | |
Renvoie les noms des répertoires |
6. Points non évidents et erreurs typiques
Erreur à la création : pas de droits ou chemin incorrect
Si vous tentez de créer un dossier dans des répertoires système (par exemple "C:\Windows\System32\SuperApp"), vous obtiendrez probablement une exception UnauthorizedAccessException ou IOException.
Astuces pratiques :
Gérez toujours les erreurs avec try-catch si vous travaillez avec des dossiers externes (par exemple sur la clé USB de l'utilisateur ou un disque réseau).
Ne faites pas aveuglément confiance aux chemins fournis en entrée.
try
{
Directory.CreateDirectory(pathFromUser);
}
catch (Exception ex)
{
Console.WriteLine($"Impossible de créer le dossier : {ex.Message}");
}
Suppression si le dossier est utilisé par un autre processus
Si quelqu'un (ou votre propre programme) a ouvert un fichier dans le dossier et le garde ouvert, en essayant de supprimer le dossier vous obtiendrez une IOException — "impossible de supprimer, le dossier est utilisé". Fermez d'abord tous les fichiers à l'intérieur du dossier.
Le dossier n'est pas vide et vous avez oublié recursive: true
Problème très fréquent. Si vous n'indiquez pas recursive: true et que le dossier n'est pas vide — vous recevrez une exception.
Utilisez des chemins absolus pour les opérations critiques
Travailler avec des chemins relatifs ("Reports") se fait toujours par rapport au répertoire de travail courant de l'application. Si le programme est lancé d'un autre endroit, le dossier sera créé ailleurs que prévu. Vérifiez d'où est lancé votre code, ou donnez immédiatement un chemin complet :
string fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "MyAppData");
Directory.CreateDirectory(fullPath);
GO TO FULL VERSION