Kurz: System.IO bietet File, Directory und Path:
Teil des Kurses C#
Dateien
System.IO bietet File, Directory und Path:
string ordner = Path.Combine(Path.GetTempPath(), "kurs-demo");
Directory.CreateDirectory(ordner);
string datei = Path.Combine(ordner, "notiz.txt");
File.WriteAllText(datei, "Zeile 1\nZeile 2\n");
File.AppendAllText(datei, "Zeile 3\n");
string inhalt = File.ReadAllText(datei);
string[] zeilen = File.ReadAllLines(datei);
Console.WriteLine($"{zeilen.Length} Zeilen, {inhalt.Length} Zeichen");
Console.WriteLine(File.Exists(datei) + " " + Path.GetFileName(datei) + " " + Path.GetExtension(datei));
foreach (var z in File.ReadLines(datei).Where(z => z.Contains('3'))) Console.WriteLine(z.Trim()); // zeilenweise, lazy
using (var schreiber = new StreamWriter(Path.Combine(ordner, "stream.txt")))
{
schreiber.WriteLine("über einen Stream");
}
using (var leser = new StreamReader(Path.Combine(ordner, "stream.txt")))
{
string? zeile;
while ((zeile = leser.ReadLine()) != null) Console.WriteLine(zeile);
}
Console.WriteLine(string.Join(",", Directory.GetFiles(ordner).Select(Path.GetFileName).OrderBy(n => n)));
Directory.Delete(ordner, recursive: true);
Console.WriteLine(Directory.Exists(ordner));Ausgabe:
3 Zeilen, 24 Zeichen
True notiz.txt .txt
Zeile 3
über einen Stream
notiz.txt,stream.txt
FalseEs gibt zu jeder Methode eine asynchrone Variante (File.ReadAllTextAsync, …). Baue Pfade immer mit Path.Combine. Dateizugriffe können IOException, FileNotFoundException und UnauthorizedAccessException auslösen.
JSON
System.Text.Json ist eingebaut:
using System.Text.Json;
using System.Text.Json.Serialization;
var mia = new Nutzer("Mia", 17, ["Lesen", "Rad"]);
var optionen = new JsonSerializerOptions { WriteIndented = true, PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
string json = JsonSerializer.Serialize(mia, optionen);
Console.WriteLine(json);
Nutzer? zurueck = JsonSerializer.Deserialize<Nutzer>(json, optionen);
Console.WriteLine($"{zurueck?.Name} {zurueck?.Hobbys.Count}");
var liste = JsonSerializer.Deserialize<List<Nutzer>>("""[{"name":"Tom","alter":19,"hobbys":[]}]""", optionen);
Console.WriteLine(liste![0].Name);
try { JsonSerializer.Deserialize<Nutzer>("{kaputt"); }
catch (JsonException) { Console.WriteLine("ungültiges JSON"); }
using var dok = JsonDocument.Parse("""{"a":{"b":[10,20,30]}}""");
Console.WriteLine(dok.RootElement.GetProperty("a").GetProperty("b")[1].GetInt32());
record Nutzer(string Name, int Alter, List<string> Hobbys);Ausgabe:
{
"name": "Mia",
"alter": 17,
"hobbys": [
"Lesen",
"Rad"
]
}
Mia 2
Tom
ungültiges JSON
20Weitere Attribute: [JsonPropertyName("x")], [JsonIgnore]. Alternative Bibliothek: Newtonsoft.Json (JsonConvert).
Datum und Zeit
var d = new DateTime(2025, 3, 8, 14, 30, 0);
Console.WriteLine($"{d:dd.MM.yyyy HH:mm} {d.DayOfWeek} {d.DayOfYear} {DateTime.IsLeapYear(2024)}");
Console.WriteLine(d.AddDays(30).ToString("yyyy-MM-dd") + " " + d.AddMonths(-1).ToString("MMMM yyyy", System.Globalization.CultureInfo.InvariantCulture));
var diff = new DateTime(2025, 12, 24) - new DateTime(2025, 3, 8);
Console.WriteLine($"{diff.Days} Tage, {diff.TotalHours} Stunden");
DateOnly tag = new(2025, 12, 24);
TimeOnly zeit = new(18, 0);
Console.WriteLine($"{tag} {zeit} {tag.DayOfWeek}");
Console.WriteLine(DateTime.Parse("2025-03-08T14:30:00").Hour + " " + DateTime.TryParse("kein Datum", out _));
var utc = new DateTimeOffset(2025, 7, 1, 12, 0, 0, TimeSpan.Zero);
Console.WriteLine(utc.ToOffset(TimeSpan.FromHours(2)).ToString("HH:mm zzz"));
var spanne = TimeSpan.FromMinutes(135);
Console.WriteLine($"{spanne} {spanne.TotalHours:F2}");Ausgabe:
08.03.2025 14:30 Saturday 67 True
2025-04-07 February 2025
291 Tage, 6984 Stunden
12/24/2025 18:00 Wednesday
14 False
14:00 +02:00
02:15:00 2.25Speichere Zeitpunkte in UTC (DateTime.UtcNow, DateTimeOffset) und rechne erst zur Anzeige in die Ortszeit um.
Umgebung und Argumente
Console.WriteLine(Environment.ProcessorCount > 0);
Console.WriteLine(Environment.GetEnvironmentVariable("GIBT_ES_NICHT") ?? "nicht gesetzt");
Console.WriteLine(Environment.GetCommandLineArgs().Length >= 1);
Console.WriteLine(OperatingSystem.IsLinux() || OperatingSystem.IsWindows() || OperatingSystem.IsMacOS());Ausgabe:
True
nicht gesetzt
True
TrueMerke
File,Directory,Path,StreamReader/StreamWriterfür Dateien;Path.Combinefür Pfade;usingfür StreamsSystem.Text.Json:Serialize,Deserialize,JsonDocumentDateTime,DateOnly,TimeOnly,DateTimeOffset,TimeSpanfür Zeit; Zeitpunkte in UTC speichern- Formate:
ToString("dd.MM.yyyy"); Kultur beachten - Dateizugriffe fangen
IOExceptionund Co. ab
Übungsaufgabe
Speichere eine Liste von Objekten als JSON-Datei, lies sie wieder ein und gib sie sortiert aus.
Quiz zur Selbstkontrolle
Wie baust du einen Dateipfad plattformunabhängig?
- Path.Combine(…) (richtig)
- ordner + ”/” + datei
- ordner + ”\” + datei
- File.Path(…)
Welche Klasse serialisiert Objekte in JSON?
- JsonSerializer (richtig)
- JsonWriter
- TextConverter
- ObjectFormatter
Wie speicherst du Zeitpunkte am besten?
- In UTC (DateTime.UtcNow / DateTimeOffset) (richtig)
- Als Text in Ortszeit
- Als int
- Als string ohne Zone
Weiter im Kurs
Zurück: Asynchrone Programmierung mit async/await
Weiter: Projekte, NuGet und Tests
Alle Kapitel: C# im Überblick