EMZETT.
Login

Kurz: System.IO bietet File, Directory und Path:

Teil des Kurses C#

Kapitel 14 von 16 im Kurs C# (Abschnitt „Praxis“). Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

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
False

Es 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
20

Weitere 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.25

Speichere 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
True

Merke

  • File, Directory, Path, StreamReader/StreamWriter für Dateien; Path.Combine für Pfade; using für Streams
  • System.Text.Json: Serialize, Deserialize, JsonDocument
  • DateTime, DateOnly, TimeOnly, DateTimeOffset, TimeSpan für Zeit; Zeitpunkte in UTC speichern
  • Formate: ToString("dd.MM.yyyy"); Kultur beachten
  • Dateizugriffe fangen IOException und Co. ab

Übungsaufgabe

Speichere eine Liste von Objekten als JSON-Datei, lies sie wieder ein und gib sie sortiert aus.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Asynchrone Programmierung mit async/await

Weiter: Projekte, NuGet und Tests

Alle Kapitel: C# im Überblick