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:
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é 2x (46.81 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#