Lekcja 9. Praca z plikami (TXT i JSON)
Trudny / egzaminacyjnyPo co się tego uczymy?
To domknięcie działu fundamentów — bez zapisu do pliku każdy program "zapomina" wszystko po zamknięciu. Format JSON, którego się tutaj nauczysz, wykorzystasz jeszcze wielokrotnie: w aplikacjach mobilnych .NET MAUI (zapis danych lokalnie) i w komunikacji z serwerami webowymi.
Teoria
Dane w zmiennych, tablicach i kolekcjach znikają, gdy program się kończy — żeby dane PRZETRWAŁY zamknięcie programu, trzeba je zapisać na dysku, w pliku. Klasy do pracy z plikami w C# znajdują się w przestrzeni nazw System.IO.
Zapisywanie tekstu do pliku:
File.WriteAllText("dane.txt", "Treść pliku"); — nadpisuje CAŁĄ zawartość pliku (tworzy plik, jeśli nie istnieje).
Odczytywanie tekstu z pliku:
string tresc = File.ReadAllText("dane.txt");
Dopisywanie do pliku (bez nadpisywania istniejącej zawartości):
File.AppendAllText("dane.txt", "Nowa linian");
Praca linia po linii — przydatna, gdy plik zawiera listę rekordów, jeden na linię:
string[] linie = File.ReadAllLines("dane.txt"); zwraca tablicę, gdzie każdy element to jedna linia pliku.
Pliki JSON — format do zapisywania danych STRUKTURALNYCH (nie tylko czystego tekstu), np. całych obiektów czy list. C# udostępnia do tego bibliotekę System.Text.Json:
Serializacja (zamiana obiektu/listy C# na tekst JSON do zapisania): string json = JsonSerializer.Serialize(lista);
Deserializacja (odczytanie tekstu JSON z powrotem jako obiekt/listę C#): List<string> lista = JsonSerializer.Deserialize<List<string>>(json);
JSON jest szczególnie ważny, bo dokładnie w tym formacie będziesz zapisywać dane w aplikacjach mobilnych .NET MAUI i wymieniać dane z serwerami webowymi.
Przykład z życia
Gdy gra komputerowa zapamiętuje Twój postęp między sesjami, w tle najczęściej zapisuje go właśnie jako plik JSON — strukturę danych (poziom, punkty, ekwipunek) łatwą do odczytania z powrotem przy następnym uruchomieniu.
Kod (C#)
using System;
using System.IO;
using System.Collections.Generic;
using System.Text.Json;
class Program
{
static void Main()
{
// zapis zwykłego tekstu
File.WriteAllText("powitanie.txt", "Witaj w pliku tekstowym!");
string odczytany = File.ReadAllText("powitanie.txt");
Console.WriteLine("Z pliku: " + odczytany);
// zapis listy jako JSON
List<string> ulubioneFilmy = new List<string> { "Podróż w czasie", "Ostatni bastion" };
string json = JsonSerializer.Serialize(ulubioneFilmy);
File.WriteAllText("filmy.json", json);
Console.WriteLine("Zapisano JSON: " + json);
// odczyt listy z JSON
string odczytanyJson = File.ReadAllText("filmy.json");
List<string> wczytaneFilmy = JsonSerializer.Deserialize<List<string>>(odczytanyJson);
foreach (string film in wczytaneFilmy)
{
Console.WriteLine("Wczytany film: " + film);
}
}
}
Komentarz i wyjaśnienie kodu
JsonSerializer.Serialize(ulubioneFilmy) zamienia listę C# na tekst w formacie JSON (np. ["Podróż w czasie","Ostatni bastion"]) gotowy do zapisania w pliku. JsonSerializer.Deserialize<List<string>>(...) robi operację odwrotną — z tekstu JSON odtwarza prawdziwą listę C#, na której możesz od razu pracować (np. pętlą foreach).
Ćwiczenie samodzielne
Zapisz do pliku tekstowego swoje imię i nazwisko, a następnie odczytaj i wypisz zawartość tego pliku.
Plac zabaw — wypróbuj online
Poniższy kod wykonuje się od razu w Twojej przeglądarce — nic nie trzeba instalować. Zmień kod i kliknij „Uruchom”.
Zadania do pracy własnej
Napisz program zapisujący do pliku listę pięciu Twoich ulubionych filmów (po jednym w linii) za pomocą
File.WriteAllLines(), a potem odczytujący je z powrotem.Zapisz
Dictionary<string, int>(np. produkty i ich ilości w magazynie) jako plik JSON, a następnie wczytaj go z powrotem i wypisz zawartość.Zbuduj prosty "dziennik zamówień": za każdym uruchomieniem programu dopisz do pliku
zamowienia.txtjedną nową linię z datą i wpisaną na sztywno kwotą zamówienia (File.AppendAllText), a na starcie programu wczytaj cały plik i wypisz sumę wszystkich dotychczasowych zamówień.
Typowe błędy
Częsty błąd to użycie File.WriteAllText() zamiast File.AppendAllText(), gdy celem jest DOPISANIE danych — WriteAllText zawsze nadpisuje całą dotychczasową zawartość pliku. Drugi błąd: próba odczytu pliku, który jeszcze nie istnieje — zgłosi wyjątek FileNotFoundException (Lekcja 16). Trzeci: próba deserializacji JSON do niewłaściwego typu (np. List<string>, gdy plik zawiera Dictionary) — zgłosi błąd w trakcie działania programu.
Nawiązanie do egzaminu zawodowego
To realizacja efektu INF.04.3.2 z podstawy programowej w zakresie "typu plikowego" jako złożonego typu danych, a także praktyczne przygotowanie pod obsługę plików i danych JSON wymaganą w INF.04.6 (aplikacje mobilne, m.in. Preferences i lokalny zapis danych).