CodeGym /Cours /C# SELF /Déplacement de fichiers et de répertoires

Déplacement de fichiers et de répertoires

C# SELF
Niveau 40, Leçon 3
Disponible

1. Introduction

Il y a des tonnes de scénarios où on a besoin d'opérations de déplacement : déplacer des fichiers "téléchargés" du dossier temporaire vers le dossier Documents, organiser en masse des photos, renommer selon un modèle, traiter le courrier et les logs. Le système de fichiers aime l'ordre — ou au moins une illusion d'ordre ! Et un bon développeur doit savoir mettre un peu d'ordre.

En plus, ces tâches tombent souvent en entretien : "Écrivez un utilitaire qui renomme tous les fichiers en ajoutant un numéro de version", ou "Faites une commande qui déplace les documents obsolètes vers l'archive". Voyons comment faire ça en C#.

Aperçu des possibilités

En .NET il y a deux façons principales pour déplacer et renommer — utiliser les méthodes statiques (File.Move, Directory.Move) ou les méthodes d'instance (FileInfo.MoveTo, DirectoryInfo.MoveTo). Toutes ces méthodes font quasiment la même chose en coulisses — la différence est surtout de syntaxe.

Comment .NET "voit" déplacement et renommage ?

Attention ! Renommer et déplacer — c'est essentiellement la même opération : un fichier ou un dossier est identifié par son chemin. Si le chemin change — on considère que l'objet a été "déplacé" ou "renommé". Si vous changez seulement le nom mais restez dans le même répertoire — c'est un renommage. Si vous changez tout le chemin — c'est un déplacement. Philosophiquement, comme Schrödinger : l'objet est à la fois déplacé et renommé si vous donnez un nouveau chemin avec un nouveau nom !

2. Déplacement et renommage de fichiers : exemples

On ira du simple au complexe en se basant sur notre mini gestionnaire de fichiers.

Méthode statique File.Move

Voici un exemple pour déplacer (ou renommer) un fichier :


// On déplace le fichier test1.txt vers un autre dossier avec un nouveau nom
File.Move(@"C:\Temp\test1.txt", @"C:\Archive\test1_archived.txt");

Et si on veut juste renommer le fichier dans le même dossier :


// On change juste le nom du fichier
File.Move(@"C:\Temp\test1.txt", @"C:\Temp\test_renamed.txt");

Voilà la magie ! .NET "découpe" simplement un chemin et "affecte" l'objet à un autre, si les deux chemins sont accessibles et qu'il n'y a pas de conflits.

Méthode statique Directory.Move

Avec les dossiers c'est la même chose :


// On déplace le dossier
Directory.Move(@"C:\Temp\OldFolder", @"C:\Temp\NewFolder");

On peut soit renommer le dossier (nouveau nom dans le même répertoire), soit le déplacer complètement ailleurs.

3. Méthodes d'instance : FileInfo.MoveTo et DirectoryInfo.MoveTo

Quand vous avez déjà un objet FileInfo ou DirectoryInfo, vous pouvez appeler la méthode MoveTo() :


var fileInfo = new FileInfo(@"C:\Temp\test1.txt");
fileInfo.MoveTo(@"C:\Archive\test1_archived.txt");

// Dossiers :
var dirInfo = new DirectoryInfo(@"C:\Temp\OldFolder");
dirInfo.MoveTo(@"C:\Temp\NewFolder");

Ici aussi : si le nouveau chemin est le même dossier mais avec un nom différent, c'est un renommage ; si c'est un autre dossier, c'est un déplacement.

4. Et si le fichier existe déjà à la destination ?

Là commencent les subtilités qui aiment "mordre" au pire moment.

File.Move

Si un fichier existe déjà au chemin de destination indiqué — une exception IOException sera levée, et votre code "tombera" :


try
{
    File.Move("data.txt", "archive\\data.txt");
}
catch (IOException ex)
{
    Console.WriteLine("Le fichier de destination existe déjà ! " + ex.Message);
}

FileInfo.MoveTo

Même chose — IOException si le fichier de destination existe.

Directory.Move

Avec les dossiers c'est encore plus strict : si le dossier cible existe déjà — exception. Vous ne pouvez pas déplacer un dossier vers un emplacement déjà occupé.

Moralité : Vérifiez toujours qu'il n'y a pas déjà un fichier ou un dossier à l'endroit où vous essayez d'écrire !


// On vérifie calmement s'il y a un fichier à la destination
if (!File.Exists("archive\\data.txt"))
{
    File.Move("data.txt", "archive\\data.txt");
}
else
{
    Console.WriteLine("Le fichier de destination existe déjà !");
}

5. Nuances utiles

Exemple de renommage d'un dossier


var oldDir = @"C:\Projects\OldReport";
var newDir = @"C:\Projects\NewReport";

// On vérifie que le nouveau dossier n'existe pas et que l'ancien existe
if (Directory.Exists(oldDir) && !Directory.Exists(newDir))
{
    Directory.Move(oldDir, newDir);
    Console.WriteLine("Le dossier a été renommé avec succès.");
}
else
{
    Console.WriteLine("Erreur : le dossier source est introuvable ou le nouveau existe déjà.");
}

Renommage en tenant compte du contenu imbriqué

Tout le contenu du dossier (sous-dossiers, fichiers) sera déplacé avec lui sans commandes supplémentaires ! C'est pratique : en une commande, un dossier avec n'importe quelle profondeur se retrouve au nouvel emplacement.

Bonnes pratiques et méthodes utiles de la classe Path

Quand vous renommez ou déplacez des fichiers, utilisez les méthodes de la classe System.IO.Path pour construire correctement le nouveau chemin ou modifier le nom du fichier :

  • Obtenir le nom de fichier sans extension : Path.GetFileNameWithoutExtension(path)
  • Changer seulement l'extension : Path.ChangeExtension(path, ".bak")
  • Construire un nouveau chemin avec un autre nom : Path.Combine(Path.GetDirectoryName(path), "newname.txt")

string oldPath = @"C:\Reports\2023_Final.docx";
string newName = "2023_Archive.docx";
string newPath = Path.Combine(Path.GetDirectoryName(oldPath)!, newName);

File.Move(oldPath, newPath);

6. Points importants et erreurs typiques

Permissions et verrouillage

Si vous n'avez pas les droits d'écriture sur l'un des chemins — une exception UnauthorizedAccessException sera levée. De même, si le fichier est utilisé par un autre processus (par exemple ouvert dans Word), vous aurez une erreur. C'est un cas très fréquent.

Déplacement entre disques et volumes différents

En pratique, File.Move effectue une opération de renommage rapide à l'intérieur d'un même volume/disque. Si vous essayez de déplacer un fichier du disque C vers le disque D — .NET fera automatiquement une copie puis supprimera le fichier source. Si quelque chose tourne mal (par exemple, le disque de destination est plein), le fichier source restera en place.

Fait intéressant : presque tous les systèmes de fichiers modernes supportent le "rename/move" rapide à l'intérieur d'un volume, et lors du déplacement entre volumes — copy + delete.

Déplacer des dossiers entiers (Directory.Move)

Vous ne pouvez pas déplacer un dossier à l'intérieur de lui-même ni dans un de ses sous-dossiers (par exemple C:\Data vers C:\Data\Archive) — cela provoquera une erreur.

Comment déplacer en toute sécurité ?

Avant tout déplacement, surtout en masse, vérifiez l'existence de la source (File.Exists, Directory.Exists) et l'absence de conflit à la destination. Et n'oubliez pas le try-catch : le système de fichiers est capricieux, il peut lancer une erreur au moment le plus inattendu.

2
Mission
C# SELF, niveau 40, leçon 3
Bloqué
Déplacement de tous les fichiers d’un dossier vers un autre
Déplacement de tous les fichiers d’un dossier vers un autre
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION