Dateien und Streams: Dateizugriffe
Für einfache Dateizugriffe können wir die statische Klasse File verwenden. Diese befindet sich so wie alle anderen Klassen für Datei- und Ordneroperationen im Namensraum System.IO. Um erweiterte Dateizugriffe vornehmen zu können werden wir später die Klassen StreamWriter und StreamReader kennenlernen.
Um Dateien zu schreiben, können wir die Funktionen WriteAllText() und WriteAllLines() verwenden. Beide Funktionen erwarten zwei Parameter: Zum einen den Dateinamen (als ersten Parameter) und zum andern die Daten, welche geschrieben werden sollen (als zweiten Parameter). WriteAllText() schreibt den angegebenen string in die Datei. WriteAllLines() benötigt dagegen als zweiten Parameter ein Array aus Zeichenketten. Mit der Funktion AppendAllText() kann die angegebene Zeichenkette an die angegebene Datei angehängt werden. Natürlich gibt es auch Funktionen zum Lesen von Dateien: ReadAllText() und ReadAllLines(). Beide Funktionen erwarten als Parameter den Dateinamen. Die Funktionen geben eine Zeichenkette bzw. ein Array aus Zeichenketten zurück.
Es gibt noch weitere Funktionen, um verschiedene Datei-Aktionen auszuführen. Die Funktion Copy() erstellt eine Kopie einer Datei. Die Funktion ist überladen und kann mit zwei oder drei Parametern aufgerufen werden. Die ersten zwei Parameter sind der Quell- und Zieldateiname. Der dritte (optionale) Parameter gibt an, ob die Ziel-Datei überschrieben werden soll oder nicht. Bei einem Aufruf mit zwei Parametern wird die Ziel-Datei nicht überschrieben. Natürlich ist es auch möglich, eine Datei zu verschieben. Hierfür dient die Funktion Move(). Die Move()-Funktion besitzt keine Überladungen, wodurch die Ziel-Datei nie überschrieben wird. Das Löschen einer Datei ist über die Funktion Delete() möglich, welche als Parameter den Dateinamen benötigt. Mit der Funktion Exists() kann geprüft werden, ob die angegebene Datei existiert. Als Rückgabewert verwendet die Funktion ein bool.
Grundlegend gilt: So gut wie alle Datei- und Ordner-Funktionen können Exceptions auslösen, weshalb es sich empfiehlt, einen try-catch-Block einzusetzen. Gängige Exceptions für solche Funktionen sind IOException, DirectoryNotFoundException, FileNotFoundException und UnauthorizedAccessException.
Program.cs
const string sDateinameTest = "test.txt"; const string sDateinameTestCopy = "test2.txt"; const string sDateinameLog = "logfile.txt"; string[] sDateiInhaltSchreiben = new string[] { "C#-Buch V 2.0", "", "Kapitel 5 (Dateien und Streams)", "Thema 1 (Dateizugriffe)" }; string[] sDateiInhaltLesen; try { // Daten in Datei schreiben und danach lesen Console.WriteLine("Test-Datei wird geschrieben ..."); File.WriteAllLines(sDateinameTest, sDateiInhaltSchreiben); Console.WriteLine("Test-Datei wurde geschrieben!"); Console.WriteLine("Test-Datei wird gelesen ..."); sDateiInhaltLesen = File.ReadAllLines(sDateinameTest); if (sDateiInhaltSchreiben.Length == sDateiInhaltLesen.Length) { for (int i = 0; i < sDateiInhaltSchreiben.Length; i++) if (sDateiInhaltSchreiben[i] != sDateiInhaltLesen[i]) Console.WriteLine("In Zeile {0} wurde ein Unterschied gefunden!", i); } else Console.WriteLine("Die Länge des gelesenen und geschrieben Arrays stimmt nicht überein!"); Console.WriteLine("Test-Datei wurde gelesen!"); Console.WriteLine(); // Logfile-Eintrag schreiben Console.WriteLine("Logfile wird geschrieben ..."); File.AppendAllText(sDateinameLog, "Das Programm wurde erfolgreich ausgeführt!\r\n"); // \r\n ist der Zeilenumbruch für Windows Console.WriteLine("Logfile wurde geschrieben!"); Console.WriteLine(); Console.WriteLine("Führe Dateiaktionen aus ..."); File.Copy(sDateinameTest, sDateinameTestCopy, true); // true = überschreiben erlaubt File.Delete(sDateinameTest); File.Move(sDateinameTestCopy, sDateinameTest); if (!File.Exists(sDateinameTestCopy)) // Bedingung sollte immer zutreffen File.Create(sDateinameTestCopy); else Console.WriteLine("Kopie der Test-Datei existiert bereits!"); Console.WriteLine("Dateiaktionen wurden ausgeführt!"); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.ReadKey();