CodeGym /Cours /C# SELF /Création et suppression de répertoires ( Directory)

Création et suppression de répertoires ( Directory)

C# SELF
Niveau 40, Leçon 1
Disponible

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
Directory.CreateDirectory(path)
Crée récursivement tous les dossiers du chemin
Vérifier l'existence
Directory.Exists(path)
Retourne true ou false
Supprimer un dossier vide
Directory.Delete(path)
Lance une erreur si le dossier n'est pas vide
Supprimer un dossier avec contenu
Directory.Delete(path, recursive: true)
Efface irrémédiablement tout à l'intérieur
Obtenir la liste des fichiers
Directory.GetFiles(path)
Renvoie les noms des fichiers
Obtenir la liste des sous-dossiers
Directory.GetDirectories(path)
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);
2
Mission
C# SELF, niveau 40, leçon 1
Bloqué
Création d'une structure de dossiers personnalisée
Création d'une structure de dossiers personnalisée
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION