This article has been localized into German by the community.
Dateien einlesen und ausgeben
In diesem Kapitel sehen wir uns an, wie man in C# einfache Dateien lesen und schreiben kann. Glücklicherweise macht uns das C# ganz einfach. Die File-Klasse des System.IO Namensraum enthält so ziemlich alles was wir brauchen; sie macht es uns sehr einfach Dateien auszulesen und zu Schreiben.
In unserem ersten Beispiel konstruieren wir einen extrem minimalistischen Texteditor. Tatsächlich ist es so einfach, dass wir nur eine Datei lesen und dann neuen Inhalt und nur eine einzelne Textzeile auf einmal schreiben können. Es zeigt jedoch, wie einfach es ist, die File-Klasse zu verwenden:
using System;
using System.IO;
namespace FileHandlingArticleApp
{
class Program
{
static void Main(string[] args)
{
if(File.Exists("test.txt"))
{
string content = File.ReadAllText("test.txt");
Console.WriteLine("Current content of file:");
Console.WriteLine(content);
}
Console.WriteLine("Please enter new content for the file:");
string newContent = Console.ReadLine();
File.WriteAllText("test.txt", newContent);
}
}
}
Sie werden feststellen, dass wir die File-Klasse an drei Stellen verwenden: Wir verwenden sie, um zu prüfen, ob unsere Datei existiert, wir verwenden die ReadAllText()-Methode, um den Inhalt der Datei zu lesen, und wir verwenden die WriteAllText()-Methode, um neuen Inhalt in die Datei zu schreiben. Sie werden feststellen, dass ich keine absoluten Pfade verwende, sondern nur einen einfachen Dateinamen. Dadurch wird die Datei im selben Verzeichnis wie die ausführbare Datei abgelegt. Dies ist vorläufig in Ordnung. Abgesehen davon sollte das Beispiel leicht verständlich sein: Wir prüfen, ob die Datei vorhanden ist, lesen deren Inhalt und geben sie an die Konsole aus. Dann fordern wir den Benutzer zur Eingabe neuer Inhalte auf, und sobald wir ihn haben, schreiben wir ihn in die Datei. Offensichtlich wird dadurch der vorherige Inhalt überschrieben, aber für den Moment ist das in Ordnung. Wir könnten jedoch stattdessen die AppendAllText-Methode verwenden. Ändern Sie stattdessen die WriteAllText-Zeile wie folgt:
File.AppendAllText("test.txt", newContent);
Wenn Sie es ausführen, werden Sie sehen, dass der neue Text zum vorhandenen Text hinzugefügt wird, anstatt ihn zu überschreiben. So einfach ist das. Wir erhalten jedoch immer nur eine Zeile Text pro Ausführung unserer Anwendung. Lassen Sie uns ein bisschen kreativ sein und das ändern. Ersetzen Sie die letzten Zeilen in unserem Beispiel folgendermaßen:
Console.WriteLine("Please enter new content for the file - type exit and press enter to finish editing:");
string newContent = Console.ReadLine();
while(newContent != "exit")
{
File.AppendAllText("test.txt", newContent + Environment.NewLine);
newContent = Console.ReadLine();
}
Wie Sie sehen, weisen wir den Benutzer an, das Wort exit einzugeben, wenn er die Bearbeitung der Datei beenden möchte. Bis dies geschieht, hängen wir die Benutzereingabe an die Datei an und fordern eine neue Zeile auf. Wir fügen auch ein Newline-Zeichen, das Environment.NewLine, hinzu, damit es wie tatsächliche Textzeilen aussieht.
Anstatt jedoch jedes Mal in die Datei zu schreiben, würde eine schönere Lösung wahrscheinlich in etwa wie folgt aussehen:
Console.WriteLine("Please enter new content for the file - type exit and press enter to finish editing:");
using(StreamWriter sw = new StreamWriter("test.txt"))
{
string newContent = Console.ReadLine();
while(newContent != "exit")
{
sw.Write(newContent + Environment.NewLine);
newContent = Console.ReadLine();
}
}
Die Verwendung von Streams ist etwas außerhalb des Geltungsbereichs dieses Kapitels, aber in diesem Beispiel ist das tolle daran, dass wir die Datei nur einmal öffnen und dann die Änderungen in die Datei schreiben, sobald wir zufrieden sind. In diesem Fall nutzen wir die using()-Anweisung von C#, die sicherstellt, dass die Dateireferenz geschlossen wird, sobald sie den Gültigkeitsbereich verlässt, dh wenn der Block von {} beendet ist. Wenn Sie die using() - Anweisung nicht verwenden, müssen Sie die Close() - Methode für die StreamWriter-Instanz manuell aufrufen.