Datei-IO und Stream-API in C#
Lernen Sie Datei-IO und die Stream-API in C#, um Dateien effizient zu lesen und zu schreiben.
In C# sind File IO (Input/Output) und die Stream API die grundlegenden Mechanismen zum Lesen und Schreiben von Dateien.
Dateien können als Text oder Binärdaten verarbeitet werden. Mit dem Stream-Ansatz lassen sich große Datenmengen effizient verarbeiten, ohne alles in den Speicher zu laden.
In diesem Artikel behandeln wir File, FileInfo, StreamReader/StreamWriter,
FileStream und BinaryReader/BinaryWriter mit umfassenden Beispielen.
Die File-Klasse
Die File-Klasse stellt statische Methoden für schnelle Dateioperationen bereit.
Häufig verwendete Methoden sind: WriteAllText, ReadAllText, AppendAllText, Exists, Delete.
using System;
using System.IO;
// In eine Datei schreiben
File.WriteAllText("demo.txt", "Hallo Welt!");
// Datei lesen
string inhalt = File.ReadAllText("demo.txt");
Console.WriteLine(inhalt);
// Existiert die Datei?
if (File.Exists("demo.txt"))
Console.WriteLine("Datei existiert.");
// In eine Datei anhängen
File.AppendAllText("demo.txt", "\nNeue Zeile hinzugefügt.");
// Datei löschen
File.Delete("temp.txt");
Die FileInfo-Klasse
FileInfo ist instanzbasiert und bietet detaillierte Informationen und Operationen für Dateien.
Enthält Methoden wie Exists, Create, Delete, CopyTo und MoveTo.
var info = new FileInfo("beispiel.txt");
// Datei erstellen, falls sie nicht existiert
if (!info.Exists)
{
using (var sw = info.CreateText())
sw.WriteLine("Diese Datei wurde mit FileInfo.Create erstellt.");
}
// Dateiinformationen ausgeben
Console.WriteLine($"Name: {info.Name}, Größe: {info.Length} Bytes, Pfad: {info.FullName}");
// Datei kopieren
info.CopyTo("beispiel_kopie.txt", overwrite: true);
// Datei verschieben
info.MoveTo("neu_beispiel.txt");
// Datei löschen
var zuLöschen = new FileInfo("neu_beispiel.txt");
if (zuLöschen.Exists)
zuLöschen.Delete();
StreamReader und StreamWriter
StreamReader und StreamWriter werden für textbasierte Dateioperationen verwendet.
Innerhalb eines using-Blocks wird die Datei nach Abschluss automatisch geschlossen.
// In eine Textdatei schreiben
using (var writer = new StreamWriter("text.txt"))
{
writer.WriteLine("Zeile 1");
writer.WriteLine("Zeile 2");
}
// Aus einer Textdatei lesen
using (var reader = new StreamReader("text.txt"))
{
string zeile;
while ((zeile = reader.ReadLine()) != null)
Console.WriteLine(zeile);
}
// Ausgabe:
// Zeile 1
// Zeile 2
FileStream
FileStream ermöglicht das Lesen und Schreiben von Dateien auf Byte-Ebene.
Besonders nützlich beim Arbeiten mit großen Dateien wie Bildern oder Videos.
// Bytes in eine Datei schreiben
byte[] daten = { 72, 101, 108, 108, 111 }; // "Hello"
using (var fs = new FileStream("daten.bin", FileMode.Create))
{
fs.Write(daten, 0, daten.Length);
}
// Bytes aus einer Datei lesen
using (var fs = new FileStream("daten.bin", FileMode.Open))
{
int b;
while ((b = fs.ReadByte()) != -1)
Console.Write((char)b);
}
// Ausgabe: Hello
BinaryReader und BinaryWriter
BinaryReader und BinaryWriter ermöglichen das Schreiben/Lesen von primitiven Datentypen
(int, double, string usw.) direkt in/aus einem Binärstrom.
using (var bw = new BinaryWriter(File.Open("zahlen.dat", FileMode.Create)))
{
bw.Write(42);
bw.Write(3.14);
bw.Write("Hallo");
}
using (var br = new BinaryReader(File.Open("zahlen.dat", FileMode.Open)))
{
int i = br.ReadInt32();
double d = br.ReadDouble();
string s = br.ReadString();
Console.WriteLine($"{i}, {d}, {s}");
}
// Ausgabe: 42, 3.14, Hallo
Beispielanwendung: Logdateiverwaltung
Im folgenden Beispiel werden Anwendungsprotokolle mit StreamWriter in eine Datei geschrieben
und anschließend mit StreamReader wieder gelesen.
Außerdem wird FileInfo verwendet, um zu prüfen, ob die Datei existiert und sie ggf. zu erstellen.
public class Logger
{
private readonly FileInfo _file = new FileInfo("app.log");
public void Log(string message)
{
if (!_file.Exists)
using (var created = _file.CreateText())
created.WriteLine("Logdatei erstellt.");
using (var sw = new StreamWriter(_file.FullName, append: true))
sw.WriteLine($"{DateTime.Now}: {message}");
}
public void ShowLogs()
{
if (_file.Exists)
{
using (var sr = new StreamReader(_file.FullName))
Console.WriteLine(sr.ReadToEnd());
}
else
{
Console.WriteLine("Logdatei nicht gefunden.");
}
}
public void ClearLogs()
{
if (_file.Exists)
_file.Delete();
}
}
class Program
{
static void Main()
{
var logger = new Logger();
logger.Log("Anwendung gestartet.");
logger.Log("Ein Fehler ist aufgetreten!");
logger.ShowLogs();
logger.ClearLogs();
}
}
// Beispielausgabe:
// 19.09.2025 12:10:05: Anwendung gestartet.
// 19.09.2025 12:10:05: Ein Fehler ist aufgetreten!
Kurz & Knapp
File: Statische Dateioperationen (WriteAllText,ReadAllText,AppendAllText,Exists,Delete).FileInfo: Instanzbasierte Dateioperationen (Create,CopyTo,MoveTo,Delete,Exists).StreamReader/StreamWriter: Textbasiertes Lesen/Schreiben.FileStream: Byte-Zugriff, geeignet für große Dateien.BinaryReader/BinaryWriter: Lesen/Schreiben primitiver Datentypen im Binärformat.- Die Stream API ermöglicht eine effiziente Verarbeitung großer Dateien, ohne sie vollständig in den Speicher zu laden.