Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.
IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

3. diel - Práca s textovými súbormi v C# .NET

V minulej lekcii, Úvod do práce so súbormi, sme si ukázali, ako fungujú prístupové práva v systémoch Windows.

V dnešnom tutoriále Súbory v C# .NET si vysvetlíme prácu s textovými súbormi s príponou .txt. Ukážeme si použitie triedy StreamWriter a StreamReader pre zápis, pripisovanie a čítanie.

Úvod

Najjednoduchšou cestou, ako uložiť dáta aplikácie na pevný disk, je využiť textové súbory. So súbormi s príponou .txt ste sa určite všetci už stretli. Text je v nich uložený jednoducho na jednotlivých riadkoch. Na oddelenie riadkov sa využívajú špeciálne znaky, ktoré sú bohužiaľ špecifické pre každý operačný systém. Toto však za nás našťastie vyrieši C#.

V rôznych materiáloch sa môžeme stretnúť s použitím rôznych tried a rôznych spôsobov na zápis do súborov. .NET framework sa v čase vyvíjal a pre niektoré funkčnosti poskytuje kvôli kompatibilite aj staršie alebo komplikovanejšie konštrukcie. Budem sa tu snažiť ukazovať spôsoby, ktoré sú najjednoduchšie a najnovšie.

Zápis textu do nového súboru

Najprv si poďme vytvoriť nový textový súbor a niečo do neho zapísať. Vytvorme si novou konzolovú aplikáciu s názvom TextFiles. Na zapisovanie do textových súborov nám .NET poskytuje triedu StreamWriter.

V zdrojovom kóde si najskôr do using pridajme System.IO. Teraz vytvorme blok using a založme v ňom novú inštanciu StreamWriter. Ako už vieme z predchádzajúcich lekcií, using sa nám automaticky postará o zatvorenie súboru po dokončení zápisu/čítania. Do konštruktora napíšeme cestu k nášmu súboru:

using (StreamWriter sw = new StreamWriter(@"file.txt"))
{
}

Náš StreamWriter je teraz nasmerovaný na správny súbor. Nový riadok zapíšeme pomocou metódy WriteLine(). Po dokončení zápisu musíme zavolať metódu Flush(), ktorá sa stará o vyprázdnenie bufferu. S tým sa tu nebudeme zaťažovať, postačí nám vedieť, že nami zapísané riadky môžu zostať chvíľu vo vyrovnávacej pamäti a my pomocou Flush() vynútime ich zápis.

Kód sa nám teda rozrástol a vyzerá takto:

using (StreamWriter sw = new StreamWriter(@"file.txt"))
{
    sw.WriteLine("The first line.");
    sw.WriteLine("This text is on the second line.");
    sw.WriteLine("And the third one.");
    sw.Flush();
}

Po spustení sa vytvorí file.txt v priečinku s naším projektom, presnejšie v bin/debug/. Ako sa správne v C# vysporiadať s cestou k súboru a právami sme prebrali v lekcii Úvod do práce so súbormi a tu to pre jednoduchosť zanedbáme. Vidíme, že súbor existuje a skutočne obsahuje náš text:

Zápis textových súborov v C# - Súbory v C# .NET

Pripísanie textu do existujúceho súboru

Ak súbor neexistuje, kód vyššie ho vytvorí. Ak existuje, bude prepísaný. Toto správanie môžeme zmeniť pomocou druhého parametra konštruktora objektu StreamWriter. Pokiaľ ho nastavíme na true, vykoná sa takzvaný append (pripísanie). Takto do existujúceho súboru pripíšeme nový riadok:

using (StreamWriter sw = new StreamWriter(@"file.txt", true))
{
    sw.WriteLine("An appended line.");
    sw.Flush();
}

Ďalším parametrom môže byť nastavenie kódovania, ale predvolené UTF-8 by nám malo vo väčšine prípadov vyhovovať.

Čítanie existujúceho súboru

Zostáva nám už len vedieť súbor načítať. Nie je to o nič zložitejšie, než zápis a opäť k tomu máme v .NET frameworku pripravenú triedu, konkrétne StreamReader. Použitie je obdobné, namiesto metódy WriteLine() použijeme ReadLine(), ktorá vracia riadok textu zo súboru a zároveň sa presunie na nasledujúci riadok. Budeme ju teda volať vo while cykle. Podmienka pre ošetrenie vyjdenia zo súboru je možno krkolomnejšia, kontrolujeme, či prebehlo priradenie nového riadka do premennej.

Kód na výpis obsahu súboru do konzoly vyzerá takto:

using (StreamReader sr = new StreamReader(@"file.txt"))
{
    string line;
    while ((line = sr.ReadLine()) != null)
    {
        Console.WriteLine(line);
    }
}

Kód celého nášho programu vyzerá teraz takto:

// writing to the file
using (StreamWriter sw = new StreamWriter(@"file.txt"))
{
    sw.WriteLine("The first line.");
    sw.WriteLine("This text is on the second line.");
    sw.WriteLine("And the third one.");
    sw.Flush();
}
Console.WriteLine("The file has been successfully written.");

// appending a text to the file
using (StreamWriter sw = new StreamWriter(@"file.txt", true))
{
    sw.WriteLine("An appended line");
    sw.Flush();
}
Console.WriteLine("A new line has been successfully appended into the file.");

// printing the contents of the file
Console.WriteLine("Printing file contents:");

using (StreamReader sr = new StreamReader(@"file.txt"))
{
    string line;
    while ((line = sr.ReadLine()) != null)
    {
        Console.WriteLine(line);
    }
}
Console.ReadKey();

A výsledok:

Konzolová aplikácia
The file has been successfully written.
A new line has been successfully appended into the file.
Printing file contents:
The first line.
This text is on the second line.
And the third one.
An appended line.

Trieda File

.NET framework v sebe obsahuje statickú triedu File s predpripravenými metódami, ktoré prácu so StreamReader / StreamWriter síce plne nenahradia, ale vo veľkom množstve prípadov si s nimi vystačíme. Posledný príklad vypisujúci všetky riadky zo súboru by sa dal zapísať takto (nezabudnite na using System.IO):

string[] lines = File.ReadAllLines(@"file.txt");
foreach (string line in lines)
{
    Console.WriteLine(line);
}

Metóda ReadAllLines() nám vráti všetky riadky textového súboru v poli stringov. Pokiaľ sa nejedná o nejaký veľký súbor, je táto metóda oveľa jednoduchšia na použitie. Na triede File nájdeme aj ďalšie podobné metódy ako:

  • WriteAllLines(stringField, filePath),
  • AppendAllLines(stringField, filePath).

Prvá spomínaná zapíše do súboru riadky z poľa stringov, druhá pripíše k existujúcemu súboru riadky z poľa stringov. Trieda obsahuje aj ekvivalenty metód, ktoré nepracujú s riadkami, ale súvislým textom. Sú to WriteAllText(text), ReadAllText() a AppendAllText(text).

V článku sme opomenuli odchytávanie výnimiek a kontrolu práv. Do súborov tiež budeme chcieť väčšinou ukladať skôr objekty ako riadky textu.

V nasledujúcej lekcii, Uloženie objektov do CSV v C# .NET, vytvoríme plne objektovú formulárovú aplikáciu s databázou užívateľov, ktorá ukladá inštancie do textových súborov vo formáte CSV.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 0x (46.81 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
Úvod do práce so súbormi
Všetky články v sekcii
Súbory v C# .NET
Preskočiť článok
(neodporúčame)
Uloženie objektov do CSV v C# .NET
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity