CodeGym /Kurse /JAVA 25 SELF /Kopieren und Verschieben von Dateien und Ordnern

Kopieren und Verschieben von Dateien und Ordnern

JAVA 25 SELF
Level 40 , Lektion 1
Verfügbar

1. Dateien kopieren

Methode Files.copy: grundlegende Syntax

In Java wird zum Kopieren von Dateien und Ordnern die statische Methode Files.copy aus dem Paket java.nio.file verwendet. Wir sind ihr bereits begegnet, schauen sie uns nun aber genauer an. Die grundlegende Syntax von Files.copy:

Files.copy(Path source, Path target, CopyOption... options)
  • source – Pfad zur Quelldatei oder zum Quellordner.
  • target – Pfad, wohin kopiert werden soll.
  • options – zusätzliche Optionen (z. B. Überschreiben erlauben).

Ein einfaches Beispiel

Kopieren wir die Datei "input.txt" aus dem aktuellen Verzeichnis in den Ordner "backup" unter dem Namen "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("Datei kopiert!");
    }
}

Wichtige Punkte:

  • Wenn die Zieldatei bereits existiert, wird die Ausnahme FileAlreadyExistsException ausgelöst.
  • Wenn der Ordner "backup" nicht existiert, wirft die Methode einen Fehler – der Ordner muss vorher angelegt werden!

Kopieren mit Überschreiben

Um das Überschreiben der Datei zu erlauben, verwenden Sie die Option StandardCopyOption.REPLACE_EXISTING:

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

Tabelle: Wichtige Kopieroptionen

Option Beschreibung
StandardCopyOption.REPLACE_EXISTING
Datei überschreiben, wenn sie bereits existiert
StandardCopyOption.COPY_ATTRIBUTES
Attribute kopieren (Erstellungsdatum usw.)
StandardCopyOption.ATOMIC_MOVE
Atomare Verschiebung (nur mit move verwendbar)

Datei in einen anderen Ordner kopieren

Vergewissern Sie sich vor dem Kopieren, dass der Zielordner existiert:

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

Ordner kopieren: Stolperstein

Die Methode Files.copy kann Ordner nur als „leere Hülle“ kopieren – der Inhalt (Dateien und Unterordner) wird nicht kopiert! Wenn Sie versuchen, einen Ordner mit Dateien zu kopieren, erhalten Sie nur ein leeres Verzeichnis. Für das Kopieren kompletter Ordner inklusive Inhalt ist ein rekursiver Durchlauf und das manuelle Kopieren jeder Datei nötig (darauf kommen wir in den nächsten Vorlesungen zurück).

Beispiel: Datei von einem Ordner in einen anderen kopieren

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

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

Fehlerbehandlung beim Kopieren

Kopieren kann aus verschiedenen Gründen fehlschlagen: kein Zugriff, Datei belegt, zu wenig Speicherplatz, Datei existiert bereits usw. Verwenden Sie besser immer try-catch:

try {
    Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
    System.out.println("Kopieren erfolgreich!");
} catch (FileAlreadyExistsException e) {
    System.out.println("Datei existiert bereits: " + target);
} catch (IOException e) {
    System.out.println("E/A-Fehler: " + e.getMessage());
}

2. Dateien und Ordner verschieben

Methode Files.move: Syntax

Das Verschieben von Dateien und Ordnern erfolgt mit der Methode:

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

Dabei ist source – der Pfad zur Datei (woher verschoben wird), target – wohin die Datei oder der Ordner gelegt werden soll, options – zusätzliche Einstellungen (z. B. Ersetzen einer vorhandenen Datei).

Übrigens ist Verschieben nicht nur ein „Umzug“ der Datei, sondern auch eine Möglichkeit zum Umbenennen (wenn sich nur der Name ändert). Und wenn im Zielordner bereits eine Datei mit diesem Namen existiert, wird eine Ausnahme ausgelöst, sofern die Option REPLACE_EXISTING nicht angegeben ist.

Beispiel: Datei in einen anderen Ordner verschieben

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

Files.move(source, target);
System.out.println("Datei verschoben!");

Verschieben mit Ersetzen einer vorhandenen Datei

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

Ordner verschieben

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

Files.move(oldDir, newDir);

Der gesamte Ordner, einschließlich verschachtelter Dateien und Unterordner, wird an den neuen Ort verschoben.
Wenn im Zielordner bereits ein Ordner mit demselben Namen existiert, erhalten Sie einen Fehler.

Verschieben zwischen verschiedenen Dateisystemen

Wenn Sie eine Datei zwischen unterschiedlichen Laufwerken verschieben (z. B. von "C:" nach "D:"), findet unter der Haube ein Kopieren mit anschließendem Löschen der Quelldatei statt. Wenn die Operation nicht atomar unterstützt wird, kann die Ausnahme AtomicMoveNotSupportedException ausgelöst werden.

Unterschied zwischen move und copy

  • copy – die Quelldatei/der Quellordner bleibt am Ort, es entsteht eine Kopie.
  • move – die Quelldatei/der Quellordner verschwindet, es bleibt nur das neue Exemplar.

3. Dateien und Ordner umbenennen

In Java gibt es keine separate Methode „Datei umbenennen“. Umbenennen ist ein Sonderfall des Verschiebens: Sie geben einen neuen Pfad mit einem anderen Namen im selben Verzeichnis an.

Beispiel: Datei umbenennen

Nehmen wir die Datei "report.txt" und benennen sie im selben Ordner in "report_old.txt" um:

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("Datei umbenannt!");

Wichtige Details

Wenn im Zielverzeichnis bereits eine Datei oder ein Ordner mit dem von Ihnen angegebenen Namen existiert, wirft die Methode eine Ausnahme. Um dies zu umgehen und das Ersetzen zu erlauben, können Sie die Option StandardCopyOption.REPLACE_EXISTING verwenden.

Beispiel:

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

// Datei umbenennen; falls sie bereits existiert, ersetzen
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);

In diesem Beispiel wird die Datei "old_name.txt" in "new_name.txt" umbenannt. Wenn im Ordner bereits eine Datei mit diesem Namen lag, wird sie überschrieben.

Ordner umbenennen

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

Files.move(oldDir, newDir);
System.out.println("Ordner umbenannt!");

4. Fehlerbehandlung beim Kopieren, Verschieben und Umbenennen

Die Arbeit mit dem Dateisystem birgt immer das Risiko unerwarteter Situationen. Hier die häufigsten Probleme:

Datei existiert bereits.
Ausnahme: FileAlreadyExistsException. Lösung: Verwenden Sie REPLACE_EXISTING, wenn Sie überschreiben möchten.

Datei oder Ordner ist durch einen anderen Prozess belegt.
Ausnahme: IOException. Beispiel: Die Datei ist in einem anderen Programm geöffnet.

Kein Zugriff auf Datei oder Ordner.
Ausnahme: AccessDeniedException. Problem mit den Benutzerrechten.

Verschieben zwischen verschiedenen Dateisystemen.
Ausnahme: AtomicMoveNotSupportedException. Nicht alle Dateisysteme unterstützen atomare Verschiebungen.

Zielordner existiert nicht.
Stellen Sie vor dem Kopieren/Verschieben sicher, dass der Zielordner vorher angelegt wurde!

Beispiel für Fehlerbehandlung

try {
    Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
} catch (FileAlreadyExistsException e) {
    System.out.println("Zieldatei existiert bereits: " + target);
} catch (AtomicMoveNotSupportedException e) {
    System.out.println("Atomare Verschiebung wird nicht unterstützt: " + e.getMessage());
} catch (IOException e) {
    System.out.println("Fehler beim Verschieben: " + e.getMessage());
}

5. Praktische Empfehlungen

Existenz des Zielpfads prüfen

Vor dem Kopieren oder Verschieben ist es immer sinnvoll zu prüfen, ob der Zielpfad belegt ist:

if (Files.exists(target)) {
    System.out.println("Datei ist bereits vorhanden; wir überschreiben nicht.");
} else {
    Files.copy(source, target);
}

Verwendung temporärer Dateien für sichere Operationen

Bei komplexen Operationen (z. B. beim Aktualisieren wichtiger Dateien) werden häufig temporäre Dateien verwendet – zuerst wird in eine temporäre Datei kopiert und anschließend die Hauptdatei ersetzt:

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

Dieser Ansatz minimiert das Risiko von Datenverlust bei Ausfällen.

Beispiel: Datensicherung vor dem Ersetzen

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("Sicherheitskopie erstellt.");
}

6. Tabelle: wichtigste Methoden und Optionen

Operation Java-NIO-Methode Besonderheiten
Kopieren
Files.copy(source, target, ...)
Kopiert den Inhalt von Ordnern nicht!
Verschieben
Files.move(source, target, ...)
Kann zum Umbenennen verwendet werden
Umbenennen
Files.move(source, target, ...)
Neuer Pfad im selben Verzeichnis
Überschreiben
StandardCopyOption.REPLACE_EXISTING
Überschreibt Ziel-Datei/-Ordner
Prüfung
Files.exists(path)
Prüft die Existenz von Datei/Ordner

7. Typische Fehler beim Kopieren, Verschieben und Umbenennen von Dateien

Fehler Nr. 1: Versuch, eine Datei in einen nicht vorhandenen Ordner zu kopieren. Wenn das Zielverzeichnis nicht angelegt ist, erhalten Sie NoSuchFileException. Lösung: den Ordner vorher mit Files.createDirectories anlegen.

Fehler Nr. 2: Versuch, einen Ordner komplett mit Files.copy zu kopieren. Die Methode kopiert nur die „leere Hülle“, nicht den Inhalt. Für ein vollständiges Kopieren ist ein rekursiver Durchlauf nötig.

Fehler Nr. 3: Fehlende Behandlung einer bereits vorhandenen Datei. Wenn REPLACE_EXISTING nicht übergeben wird und die Datei bereits existiert, wird eine Ausnahme ausgelöst. Diesen Fall besser explizit behandeln.

Fehler Nr. 4: Versuch, eine Datei umzubenennen, wenn bereits eine Datei mit dem neuen Namen existiert. Entsprechend erhalten Sie FileAlreadyExistsException. Vor dem Umbenennen kann die Existenz geprüft werden.

Fehler Nr. 5: Verschieben zwischen verschiedenen Dateisystemen. Manchmal wird die Operation nicht „atomar“ unterstützt und es wird AtomicMoveNotSupportedException ausgelöst. Verwenden Sie in diesem Fall eine normale (nicht-atomare) Verschiebung.

Fehler Nr. 6: Fehlende Zugriffsrechte oder Datei gesperrt. Wenn die Datei in einem anderen Programm geöffnet ist oder keine Schreib-/Leserechte bestehen, erhalten Sie AccessDeniedException oder IOException. Behandeln Sie solche Ausnahmen immer.

1
Aufgabe
JAVA 25 SELF, Level 40, Lektion 1
Gesperrt
Verschieben des aktuellen Berichts ins Archiv 📦
Verschieben des aktuellen Berichts ins Archiv 📦
1
Aufgabe
JAVA 25 SELF, Level 40, Lektion 1
Gesperrt
Umbenennen eines veralteten Dokuments 📝
Umbenennen eines veralteten Dokuments 📝
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION