Töö failidega (StreamReader / StreamWriter)

Miks on failid vajalikud?

Kui programm suletakse, kaovad kõik muutujates hoitud andmed. Failid võimaldavad andmeid püsivalt salvestada — need jäävad alles ka pärast programmi sulgemist. Faile kasutatakse näiteks kasutajate andmete, mängu tulemuste, seadete ja logide salvestamiseks.

C#-s kasutatakse failide lugemiseks ja kirjutamiseks peamiselt StreamReader-it ja StreamWriter-it. Mõlemad asuvad System.IO nimeruumis.


StreamWriter — faili kirjutamine

StreamWriter loob uue faili või kirjutab olemasoleva faili üle.

using System.IO;

// Loome faili ja kirjutame sinna
StreamWriter kirjutaja = new StreamWriter("andmed.txt");
kirjutaja.WriteLine("Tere, fail!");
kirjutaja.WriteLine("See on teine rida.");
kirjutaja.WriteLine("Kolmas rida.");
kirjutaja.Close(); // OLULINE: fail tuleb alati sulgeda!

Console.WriteLine("Andmed salvestatud!");

Faili lõppu lisamine (append)
Vaikimisi kirjutab StreamWriter faili sisu üle. Kui tahad olemasolevale failile juurde lisada, kasuta teist parameetrit true:

// true = lisame lõppu, ei kirjuta üle
StreamWriter kirjutaja = new StreamWriter("andmed.txt", true);
kirjutaja.WriteLine("See rida lisatakse faili lõppu.");
kirjutaja.Close();

StreamReader — faili lugemine

StreamReader loeb tekstifailist ridu ükshaaval.

using System.IO;

// Loeme faili rida realt
StreamReader lugeja = new StreamReader("andmed.txt");
string rida;

while ((rida = lugeja.ReadLine()) != null) // null = fail on lõppenud
{
    Console.WriteLine("Loetud: " + rida);
}

lugeja.Close(); // OLULINE: fail tuleb alati sulgeda!

using-plokk — parem viis failide kasutamiseks

using-plokk sulgeb faili automaatselt, isegi kui tekib viga. See on turvalisem viis failidega töötamiseks:

// Kirjutamine using-plokiga
using (StreamWriter kirjutaja = new StreamWriter("tulemus.txt"))
{
    kirjutaja.WriteLine("Andmed salvestatud automaatselt.");
} // fail suletakse automaatselt siin

// Lugemine using-plokiga
using (StreamReader lugeja = new StreamReader("tulemus.txt"))
{
    string sisu = lugeja.ReadToEnd(); // loeb kogu faili korraga
    Console.WriteLine(sisu);
}

Täielik koodinäide

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string failiNimi = "hinded.txt";

        // Salvestame hinded faili
        Console.WriteLine("=== Hinnete salvestamine ===");
        using (StreamWriter kirjutaja = new StreamWriter(failiNimi))
        {
            for (int i = 1; i <= 3; i++)
            {
                Console.Write($"Sisesta {i}. aine nimi: ");
                string aine = Console.ReadLine();

                Console.Write($"Sisesta {i}. aine hinne: ");
                string hinne = Console.ReadLine();

                kirjutaja.WriteLine($"{aine}: {hinne}");
            }
        }

        Console.WriteLine("\nHinded salvestatud!\n");

        // Loeme hinded failist
        Console.WriteLine("=== Salvestatud hinded ===");
        using (StreamReader lugeja = new StreamReader(failiNimi))
        {
            string rida;
            while ((rida = lugeja.ReadLine()) != null)
            {
                Console.WriteLine(rida);
            }
        }
    }
}