Lekce 3 - Práce s textovými soubory v C# .NET
V minulé lekci, Úvod do práce se soubory, jsme si ukázali, jak fungují přístupová práva v systémech Windows.
V dnešním tutoriálu Soubory v C# .NET si vysvětlíme
práci s textovými soubory s příponou .txt
. Ukážeme si
použití tříd StreamWriter
a StreamReader
pro
zápis, připisování a čtení.
Úvod
Nejjednodušší cestou, jak uložit data aplikace na pevný disk, je
využít textové soubory. Se soubory s příponou
.txt
jste se jistě všichni již setkali. Text je v nich uložen
jednoduše na jednotlivých řádcích. K oddělení řádků se využívá
speciálních znaků, které jsou bohužel specifické pro každý operační
systém. Toto však za nás naštěstí vyřeší C#.
V různých materiálech se můžeme setkat s použitím různých tříd a různých způsobů k zápisu do souborů. .NET framework se v čase vyvíjel a pro některé funkčnosti poskytuje kvůli kompatibilitě i starší nebo komplikovanější konstrukce. Budu se zde snažit ukazovat způsoby, které jsou nejjednodušší a nejnovější.
Zápis textu do nového souboru
Nejprve si pojďme vytvořit nový textový soubor a něco do něj zapsat.
Vytvořme si novou konzolovou aplikaci s názvem TextoveSoubory
. K
zapisování do textových souborů nám .NET poskytuje třídu
StreamWriter
.
Ve zdrojovém kódu si nejprve do using
přidejme
System.IO
. Nyní vytvořme blok using
a založme v
něm novou instanci StreamWriter
. Jak již víme z předchozích
lekcí, using
se nám automaticky postará o zavření souboru po
dokončení zápisu/čtení. Do konstruktoru napíšeme cestu k našemu
souboru.
using (StreamWriter sw = new StreamWriter(@"soubor.txt")) { }
Náš StreamWriter
je nyní nasměrovaný na správný soubor.
Nový řádek zapíšeme pomocí metody WriteLine()
. Po dokončení
zápisu musíme zavolat metodu Flush()
, která se stará o
vyprázdnění bufferu. S tím se zde nebudeme zatěžovat, postačí nám
vědět, že námi zapsané řádky mohou zůstat chvíli ve vyrovnávací
paměti a my pomocí Flush()
vynutíme jejich zápis.
Kód se nám tedy rozrostl a může vypadat např. takto:
using (StreamWriter sw = new StreamWriter(@"soubor.txt")) { sw.WriteLine("První řádek"); sw.WriteLine("Tento text je na druhém řádku"); sw.WriteLine("A do třetice."); sw.Flush(); }
Po spuštění se vytvoří soubor.txt
ve složce s naším
projektem, přesněji v bin/debug/
. Jak se správně
v C# vypořádat s cestou k souboru a právy jsme si již ukazovali a zde to
pro jednoduchost zanedbáme. Vidíme, že soubor existuje a opravdu obsahuje
náš text:

Připsání textu do existujícího souboru
Pokud soubor neexistuje, kód výše ho vytvoří. Pokud existuje,
bude přepsán. Toto chování můžeme změnit pomocí druhého
parametru konstruktoru objektu StreamWriter
. Pokud ho nastavíme na
true
, provede se takzvaný append (připsání). Takto do
existujícího souboru připíšeme nový řádek:
using (StreamWriter sw = new StreamWriter(@"soubor.txt", true)) { sw.WriteLine("Připsaný řádek"); sw.Flush(); }
Dalším parametrem může být nastavení kódování, ale výchozí UTF-8 by nám mělo ve většině případů vyhovovat.
Čtení existujícího souboru
Zbývá nám již jen umět soubor načíst. Není to o nic složitější,
než zápis a opět k tomu máme v .NET frameworku připravenou třídu,
konkrétně StreamReader
. Použití je obdobné, namísto metody
WriteLine()
použijeme ReadLine()
, která vrací
řádek textu ze souboru a zároveň se přesune na řádek následující.
Budeme ji tedy volat ve while
cyklu. Podmínka pro ošetření
vyjetí ze souboru je možná krkolomnější, kontrolujeme, zda proběhlo
přiřazení nové řádky do proměnné.
Kód k výpisu obsahu souboru do konzole vypadá takto:
using (StreamReader sr = new StreamReader(@"soubor.txt")) { string s; while ((s = sr.ReadLine()) != null) { Console.WriteLine(s); } }
Kód celého našeho programu vypadá nyní takto:
// zápis do souboru using (StreamWriter sw = new StreamWriter(@"soubor.txt")) { sw.WriteLine("První řádek"); sw.WriteLine("Tento text je na druhém řádku"); sw.WriteLine("A do třetice."); sw.Flush(); } Console.WriteLine("Do souboru bylo zapsáno."); // připsání textu do existujícího souboru using (StreamWriter sw = new StreamWriter(@"soubor.txt", true)) { sw.WriteLine("Připsaný řádek"); sw.Flush(); } Console.WriteLine("Do souboru bylo připsáno."); // výpis obsahu souboru Console.WriteLine("Vypisuji soubor:"); using (StreamReader sr = new StreamReader(@"soubor.txt")) { string s; while ((s = sr.ReadLine()) != null) { Console.WriteLine(s); } } Console.ReadKey();
A výsledek:
Konzolová aplikace
Do souboru bylo zapsáno.
Do souboru bylo připsáno.
Vypisuji soubor:
První řádek
Tento text je na druhém řádku
A do třetice.
Připsaný řádek
Třída File
.NET framework v sobě obsahuje statickou třídu File
s
předpřipravenými metodami, které práci se
StreamReader
em/StreamWriter
em sice plně nenahradí,
ale ve velkém množství případů si s nimi vystačíme. Poslední příklad
vypisující všechny řádky ze souboru by se dal zapsat takto (nezapomeňte na
using System.IO
):
string[] radky = File.ReadAllLines(@"soubor.txt"); foreach (string radka in radky) { Console.WriteLine(radka); }
Metoda ReadAllLines()
nám vrátí všechny řádky textového
souboru v poli stringů. Pokud se nejedná o nějaký velký soubor, je tato
metoda mnohem jednodušší na použití. Na třídě File
naleznete i další podobné metody jako:
WriteAllLines(poleStringu, cestaKSouboru)
,AppendAllLines(poleStringu, cestaKSouboru)
.
První zmíněná zapíše do souboru řádky z pole stringů, druhá
připíše k existujícímu souboru řádky z pole stringů. Třída obsahuje
také ekvivalenty metod, které nepracují s řádkami, ale souvislým textem.
Jsou to WriteAllText(text)
, ReadAllText()
a
AppendAllText(text)
.
V článku jsme opomenuli odchytávání výjimek a kontrolu práv. Do souborů také budeme chtít většinou ukládat spíše objekty, než řádky textu.
V příští lekci, Uložení objektů do CSV v C# .NET, vytvoříme plně objektovou formulářovou
aplikaci s databází uživatelů, která ukládá instance do textových
souborů ve formátu CSV
.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 1297x (24.76 kB)
Aplikace je včetně zdrojových kódů v jazyce C#