CodeGym /Cours /JAVA 25 SELF /Copie et déplacement de fichiers et de dossiers

Copie et déplacement de fichiers et de dossiers

JAVA 25 SELF
Niveau 40, Leçon 1
Disponible

1. Copie de fichiers

Méthode Files.copy : syntaxe de base

En Java, la copie de fichiers et de dossiers s’effectue via la méthode statique Files.copy du package java.nio.file. Nous l’avons déjà croisée, mais allons maintenant l’étudier plus en détail. Syntaxe de base de Files.copy :

Files.copy(Path source, Path target, CopyOption... options)
  • source — chemin vers le fichier ou le dossier source.
  • target — chemin de destination.
  • options — options supplémentaires (par exemple, autoriser l’écrasement).

Exemple le plus simple

Copions le fichier "input.txt" du répertoire courant vers le dossier "backup" sous le nom "input_backup.txt" :

import java.nio.file.*;

public class CopyExample {
    public static void main(String[] args) throws Exception {
        Path source = Path.of("input.txt");
        Path target = Path.of("backup/input_backup.txt");

        Files.copy(source, target);
        System.out.println("Fichier copié !");
    }
}

Points importants :

  • Si le fichier de destination existe déjà, une exception FileAlreadyExistsException sera levée.
  • Si le dossier "backup" n’existe pas, la méthode lèvera une erreur — le dossier doit être créé au préalable !

Copie avec écrasement

Pour autoriser l’écrasement d’un fichier, utilisez l’option StandardCopyOption.REPLACE_EXISTING :

Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);

Tableau : principales options de copie

Option Description
StandardCopyOption.REPLACE_EXISTING
Écraser le fichier s’il existe déjà
StandardCopyOption.COPY_ATTRIBUTES
Copier les attributs (date de création, etc.)
StandardCopyOption.ATOMIC_MOVE
Déplacement atomique (utilisé uniquement avec move)

Copier un fichier vers un autre dossier

Avant de copier un fichier, assurez-vous que le dossier de destination existe :

Path targetDir = Path.of("backup");
if (!Files.exists(targetDir)) {
    Files.createDirectory(targetDir);
}
Files.copy(source, targetDir.resolve("input_backup.txt"), StandardCopyOption.REPLACE_EXISTING);

Copie de dossiers : le piège

La méthode Files.copy ne sait copier les dossiers que comme « coquille vide » — le contenu (fichiers et sous-dossiers) n’est pas copié ! Si vous essayez de copier un dossier contenant des fichiers, vous n’obtiendrez qu’un répertoire vide. Pour copier des dossiers entiers avec leur contenu, il faut un parcours récursif et la copie manuelle de chaque fichier (nous y reviendrons dans les prochaines leçons).

Exemple : copier un fichier d’un dossier à un autre

Path source = Path.of("data/report.txt");
Path target = Path.of("backup/report.txt");

Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);

Gestion des erreurs lors de la copie

La copie peut échouer pour diverses raisons : pas d’accès, fichier occupé, espace insuffisant, fichier déjà présent, etc. Il vaut mieux utiliser systématiquement try-catch :

try {
    Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
    System.out.println("Copie réussie !");
} catch (FileAlreadyExistsException e) {
    System.out.println("Le fichier existe déjà : " + target);
} catch (IOException e) {
    System.out.println("Erreur d'entrée/sortie : " + e.getMessage());
}

2. Déplacement de fichiers et de dossiers

Méthode Files.move : syntaxe

Le déplacement de fichiers et de dossiers s’effectue avec la méthode :

Files.move(Path source, Path target, CopyOption... options)

Où source est le chemin du fichier (emplacement d’origine), target est l’endroit où placer le fichier ou le dossier, et options sont des paramètres supplémentaires (par exemple, remplacement d’un fichier existant).

À propos, déplacer n’est pas seulement « déménager » un fichier, c’est aussi un moyen de le renommer (si seul le nom change). Et si un fichier portant ce nom existe déjà dans le dossier cible, une exception sera levée à moins d’indiquer l’option REPLACE_EXISTING.

Exemple : déplacement d’un fichier vers un autre dossier

Path source = Path.of("data/report.txt");
Path target = Path.of("archive/report.txt");

Files.move(source, target);
System.out.println("Fichier déplacé !");

Déplacement avec remplacement du fichier existant

Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);

Déplacement d’un dossier

Path oldDir = Path.of("data/old_reports");
Path newDir = Path.of("archive/old_reports");

Files.move(oldDir, newDir);

Le dossier entier, y compris les fichiers et sous-dossiers, sera déplacé vers le nouvel emplacement.
Mais si un dossier portant le même nom existe déjà dans le dossier cible — vous obtiendrez une erreur.

Déplacement entre différents systèmes de fichiers

Si vous déplacez un fichier entre différents disques (par exemple, de "C:" vers "D:"), sous le capot il s’agira d’une copie suivie de la suppression du fichier source. Si l’opération n’est pas prise en charge comme atomique, une exception AtomicMoveNotSupportedException peut être levée.

Différence entre move et copy

  • copy — le fichier/le dossier d’origine reste en place, une copie est créée.
  • move — le fichier/le dossier d’origine disparaît, seul le nouvel exemplaire reste.

3. Renommage de fichiers et de dossiers

En Java, il n’existe pas de méthode distincte « renommer un fichier ». Le renommage est un cas particulier du déplacement : vous indiquez un nouveau chemin avec un autre nom dans le même répertoire.

Exemple : renommer un fichier

Supposons que nous ayons le fichier "report.txt" et que nous voulions le renommer en "report_old.txt" dans le même dossier :

Path dir = Path.of("data");
Path oldName = dir.resolve("report.txt");
Path newName = dir.resolve("report_old.txt");

Files.move(oldName, newName);
System.out.println("Fichier renommé !");

Points importants

Si un fichier ou un dossier portant le nom indiqué existe déjà dans le répertoire cible, la méthode lèvera une exception. Pour contourner cette restriction et autoriser le remplacement, vous pouvez utiliser l’option StandardCopyOption.REPLACE_EXISTING.

Exemple :

Path source = Paths.get("old_name.txt");
Path target = Paths.get("new_name.txt");

// Renommer le fichier ; s'il existe déjà — le remplacer
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);

Dans cet exemple, le fichier "old_name.txt" sera renommé en "new_name.txt". S’il y avait déjà un fichier portant ce nom dans le dossier, il sera écrasé.

Renommer un dossier

Path oldDir = Path.of("data/old_reports");
Path newDir = Path.of("data/archived_reports");

Files.move(oldDir, newDir);
System.out.println("Dossier renommé !");

4. Gestion des erreurs lors de la copie, du déplacement et du renommage

Travailler avec le système de fichiers comporte toujours un risque de situations imprévues. Voici les problèmes les plus fréquents :

Le fichier existe déjà.
Exception : FileAlreadyExistsException. Solution : utilisez REPLACE_EXISTING si vous souhaitez l’écraser.

Le fichier ou le dossier est occupé par un autre processus.
Exception : IOException. Par exemple, le fichier est ouvert dans un autre programme.

Aucun accès au fichier ou au dossier.
Exception : AccessDeniedException. Problème de droits utilisateur.

Déplacement entre différents systèmes de fichiers.
Exception : AtomicMoveNotSupportedException. Tous les systèmes de fichiers ne prennent pas en charge le déplacement atomique.

Le dossier de destination n’existe pas.
Pour la copie/le déplacement, assurez-vous que le dossier de destination est créé au préalable !

Exemple de gestion des erreurs

try {
    Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
} catch (FileAlreadyExistsException e) {
    System.out.println("Le fichier de destination existe déjà : " + target);
} catch (AtomicMoveNotSupportedException e) {
    System.out.println("Le déplacement atomique n'est pas pris en charge : " + e.getMessage());
} catch (IOException e) {
    System.out.println("Erreur lors du déplacement : " + e.getMessage());
}

5. Recommandations pratiques

Vérifier l’existence du fichier/dossier cible

Avant de copier ou de déplacer, il est toujours utile de vérifier si le chemin de destination est déjà pris :

if (Files.exists(target)) {
    System.out.println("Le fichier existe déjà, on ne l'écrase pas.");
} else {
    Files.copy(source, target);
}

Utiliser des fichiers temporaires pour des opérations sûres

Pour des opérations complexes (par exemple, la mise à jour de fichiers importants), on utilise souvent des fichiers temporaires — on copie d’abord vers un fichier temporaire, puis on remplace le fichier principal :

Path temp = Path.of("data/report.tmp");
Files.copy(source, temp, StandardCopyOption.REPLACE_EXISTING);
Files.move(temp, target, StandardCopyOption.REPLACE_EXISTING);

Cette approche minimise le risque de perte de données en cas de panne.

Exemple : sauvegarde d’un fichier avant remplacement

Path file = Path.of("data/report.txt");
Path backup = Path.of("data/report_backup.txt");

if (Files.exists(file)) {
    Files.copy(file, backup, StandardCopyOption.REPLACE_EXISTING);
    System.out.println("Sauvegarde créée.");
}

6. Tableau : méthodes et options principales

Opération Méthode Java NIO Particularités
Copie
Files.copy(source, target, ...)
Ne copie pas le contenu des dossiers !
Déplacement
Files.move(source, target, ...)
Peut être utilisé pour renommer
Renommage
Files.move(source, target, ...)
Nouveau chemin dans le même répertoire
Écrasement
StandardCopyOption.REPLACE_EXISTING
Écrase le fichier/le dossier de destination
Vérification
Files.exists(path)
Vérifie l’existence du fichier/dossier

7. Erreurs typiques lors de la copie, du déplacement et du renommage de fichiers

Erreur n°1 : tentative de copier un fichier vers un dossier inexistant. Si le répertoire cible n’est pas créé, vous obtiendrez NoSuchFileException. Solution : créer le dossier à l’avance avec Files.createDirectories.

Erreur n°2 : tentative de copier un dossier entier avec Files.copy. La méthode ne copiera qu’une « coquille vide », pas le contenu. Pour une copie complète, un parcours récursif est nécessaire.

Erreur n°3 : absence de gestion d’un fichier existant. Si vous ne passez pas REPLACE_EXISTING et que le fichier existe déjà, une exception sera levée. Il vaut mieux gérer explicitement ce cas.

Erreur n°4 : tentative de renommer un fichier alors qu’un fichier portant le nouveau nom existe déjà. De même, vous obtiendrez FileAlreadyExistsException. Avant de renommer, vous pouvez vérifier la présence du fichier.

Erreur n°5 : déplacement entre différents systèmes de fichiers. Parfois, l’opération n’est pas prise en charge de façon « atomique » et AtomicMoveNotSupportedException est levée. Dans ce cas, utilisez un déplacement classique sans atomicité.

Erreur n°6 : absence de droits d’accès ou verrouillage du fichier. Si le fichier est ouvert dans un autre programme ou si vous n’avez pas les droits d’écriture/lecture, vous obtiendrez AccessDeniedException ou IOException. Gérez toujours ces exceptions.

1
Mission
JAVA 25 SELF, niveau 40, leçon 1
Bloqué
Déplacement du rapport récent vers l'archive 📦
Déplacement du rapport récent vers l'archive 📦
1
Mission
JAVA 25 SELF, niveau 40, leçon 1
Bloqué
Renommage d'un document obsolète 📝
Renommage d'un document obsolète 📝
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION