CodeGym /Kurse /C# SELF /Datei- und Verzeichnisverschiebung

Datei- und Verzeichnisverschiebung

C# SELF
Level 40 , Lektion 3
Verfügbar

1. Einführung

Es gibt zahlreiche Szenarien, in denen Verschiebe-Operationen gebraucht werden: das Verschieben von "heruntergeladenen" Dateien aus einem temporären Ordner in den Dokumentenordner, das massenhafte Sortieren von Fotos, das Umbenennen nach einem Muster, das Aufräumen von Mail- oder Log-Dateien. Das Dateisystem mag Ordnung — oder zumindest etwas, das danach aussieht! Ein guter Entwickler sollte in der Lage sein, diese Ordnung herzustellen.

Außerdem werden solche Aufgaben oft bei Vorstellungsgesprächen gestellt: "Schreib ein Werkzeug, das alle Dateien umbenennt, indem es eine Versionsnummer anhängt", oder "Mach einen Befehl, der veraltete Dokumente ins Archiv verschiebt". Schauen wir uns an, wie das in C# gemacht wird.

Überblick über die Möglichkeiten

In .NET gibt es zwei Hauptwege zum Verschieben und Umbenennen — die Nutzung der statischen Methoden (File.Move, Directory.Move) oder der Instanzmethoden (FileInfo.MoveTo, DirectoryInfo.MoveTo). Unter der Haube machen diese Methoden größtenteils dasselbe — der Unterschied ist hauptsächlich syntaktisch.

Wie .NET Verschieben und Umbenennen "sieht"?

Achtung! Umbenennen und Verschieben sind im Kern dieselbe Operation: eine Datei oder ein Ordner wird im Dateisystem durch seinen Pfad identifiziert. Wenn sich der Pfad ändert, gilt das Objekt als "verschoben" oder "umbenannt". Wenn du nur den Namen änderst, aber das gleiche Verzeichnis beibehältst — ist es ein Umbenennen. Wenn du den kompletten Pfad änderst — ist es ein Verschieben. Eine Philosophie wie bei Schrödinger: das Objekt ist verschoben und umbenannt, wenn du einen neuen Pfad mit neuem Namen angibst!

2. Dateien verschieben und umbenennen: Beispiele

Wir gehen vom Einfachen zum Komplexen und bauen weiter auf unserem Mini-Dateimanager auf.

Statische Methode File.Move

Hier ein Beispiel, wie man eine Datei verschiebt (oder umbenennt):


// Wir verschieben die Datei test1.txt in einen anderen Ordner mit neuem Namen
File.Move(@"C:\Temp\test1.txt", @"C:\Archive\test1_archived.txt");

Und wenn du die Datei nur im selben Ordner umbenennen willst:


// Nur den Dateinamen ändern
File.Move(@"C:\Temp\test1.txt", @"C:\Temp\test_renamed.txt");

Das ist die ganze Magie! .NET "schneidet" einfach einen Pfad ab und "weist" dem Objekt einen anderen zu, vorausgesetzt beide Pfade sind erreichbar und es gibt keine Konflikte.

Statische Methode Directory.Move

Bei Ordnern funktioniert das analog:


// Einen Ordner verschieben
Directory.Move(@"C:\Temp\OldFolder", @"C:\Temp\NewFolder");

Man kann damit Ordner umbenennen (neuer Name im gleichen Verzeichnis) oder sie komplett an einen anderen Ort verschieben.

3. Instanzmethoden: FileInfo.MoveTo und DirectoryInfo.MoveTo

Wenn du bereits ein Objekt vom Typ FileInfo oder DirectoryInfo hast, kannst du die Methode MoveTo() aufrufen:


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

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

Auch hier gilt: wenn der neue Pfad dasselbe Verzeichnis mit anderem Namen ist, passiert ein Umbenennen; wenn es ein anderes Verzeichnis ist, passiert ein Verschieben.

4. Und was, wenn im Ziel schon eine Datei existiert?

Hier fangen die Nuancen an, die einem im ungünstigsten Moment "in den Hintern beißen" können.

File.Move

Wenn am Zielpfad bereits eine Datei existiert, wird eine Ausnahme vom Typ IOException geworfen und dein Code "fällt um":


try
{
    File.Move("data.txt", "archive\\data.txt");
}
catch (IOException ex)
{
    Console.WriteLine("Die Zieldatei existiert bereits! " + ex.Message);
}

FileInfo.MoveTo

Dasselbe Ergebnis — IOException, wenn die Zieldatei schon existiert.

Directory.Move

Bei Ordnern ist die Lage noch strenger: wenn der Zielordner bereits existiert, wird eine Ausnahme geworfen. Man kann keinen Ordner in einen bereits belegten Ordner verschieben.

Moral: Prüfe immer, ob dort, wo du hinschreiben willst, schon keine Datei oder kein Ordner existiert!


// Ruhig prüfen, ob die Datei am Ziel existiert
if (!File.Exists("archive\\data.txt"))
{
    File.Move("data.txt", "archive\\data.txt");
}
else
{
    Console.WriteLine("Die Zieldatei existiert bereits!");
}

5. Nützliche Details

Beispiel: Ordner umbenennen


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

// Prüfen, ob der neue Ordner nicht existiert und der alte vorhanden ist
if (Directory.Exists(oldDir) && !Directory.Exists(newDir))
{
    Directory.Move(oldDir, newDir);
    Console.WriteLine("Ordner erfolgreich umbenannt.");
}
else
{
    Console.WriteLine("Fehler: Quellordner nicht gefunden oder Zielordner existiert bereits.");
}

Umbenennen mit Berücksichtigung des gesamten Inhalts

Der gesamte Inhalt des Ordners (Unterordner, Dateien) wird zusammen mit ihm verschoben, ohne zusätzliche Befehle! Praktisch: mit einem Befehl landet ein Ordner mit beliebiger Tiefe am neuen Ort.

Best Practices und nützliche Methoden der Klasse Path

Beim Umbenennen oder Verschieben von Dateien solltest du die Methoden aus der Klasse System.IO.Path verwenden, um korrekt neue Pfade zusammenzusetzen oder Dateinamen zu ändern:

  • Dateiname ohne Erweiterung bekommen: Path.GetFileNameWithoutExtension(path)
  • Nur die Erweiterung ändern: Path.ChangeExtension(path, ".bak")
  • Einen neuen Pfad mit anderem Namen bauen: 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. Wichtige Nuancen und typische Fehler

Zugriffsrechte und Sperren

Wenn du keine Schreibrechte für einen der Pfade hast, wird eine Ausnahme vom Typ UnauthorizedAccessException geworfen. Ebenso, wenn die Datei von einem anderen Prozess verwendet wird (z. B. in Word geöffnet) — du bekommst einen Fehler. Das ist ein sehr häufiger Fall.

Verschieben zwischen verschiedenen Datenträgern und Volumes

Im Grunde führt File.Move innerhalb eines Volumes/eines Laufwerks eine schnelle Umbenennung durch. Wenn du versuchst, eine Datei von Laufwerk C nach Laufwerk D zu verschieben, führt .NET automatisch ein Kopieren mit anschließender Löschung der Quelldatei durch. Wenn etwas schiefgeht (z. B. Ziel-Laufwerk ist voll), bleibt die Quelldatei erhalten.

Interessante Tatsache: fast alle modernen Dateisysteme unterstützen "schnelles Umbenennen/Verschieben" innerhalb eines Volumes, und beim Verschieben zwischen Volumes wird kopiert + gelöscht.

Ordner komplett verschieben (Directory.Move)

Man kann einen Ordner nicht in sich selbst oder in einen seiner Unterordner verschieben (z. B. C:\Data nach C:\Data\Archive) — das führt zu einem Fehler.

Wie verschiebt man sicher?

Vor jedem Verschieben, besonders bei Massenaktionen, prüfe das Vorhandensein der Quelle (File.Exists, Directory.Exists) und das Fehlen von Konflikten am Ziel. Und vergiss nicht das try-catch: das Dateisystem ist launisch und kann jederzeit einen Fehler produzieren.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION