Lekce 3 - Práce s textovými soubory ve VB.NET
V minulém dílu seriálu tutoriálů pro VB.NET, Úvod do práce se soubory, jsme si ukázali, jak fungují přístupová práva v systémech Windows.
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ší Visual Basic .NET.
Pozn.: V různých materiálech se můžete 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řte si nový projekt (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 Imports 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 dílů, 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 sw As New StreamWriter("soubor.txt") End Using
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 sw As 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() End Using
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ě ve VB.NET 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í 2. parametru konstruktoru objektu StreamWriter. Pokud ho nastavíme na True, provede se tzv. append (připsání). Takto do existujícího souboru připíšeme nový řádek:
Using sw As New StreamWriter("soubor.txt", True) sw.WriteLine("První řádek") sw.WriteLine("Tento text je na druhém řádku") sw.WriteLine("A do třetice.") sw.Flush() End Using
Dalším parametrem může být nastavení kódování, ale výchozí UTF-8 bude bohatě stačit.
Č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 by vypadal takto:
Using sr As New StreamReader("soubor.txt") While Not sr.EndOfStream Console.WriteLine(sr.ReadLine()) End While End Using
Vlastnost EndOfStream udává jestli je v proudu ještě něco dál.
Kód celého našeho programu vypadá nyní asi takto:
' zápis do souboru Using sw As New StreamWriter("soubor.txt", True) sw.WriteLine("První řádek") sw.WriteLine("Tento text je na druhém řádku") sw.WriteLine("A do třetice.") sw.Flush() End Using Console.WriteLine("Do souboru bylo zapsáno.") ' připsání souboru Using sw As New StreamWriter("soubor.txt", True) sw.WriteLine("Připsaný řádek") sw.Flush() End Using Console.WriteLine("Do souboru bylo přiosáno.") ' výpis obsahu souboru Using sr As New StreamReader("soubor.txt") While Not sr.EndOfStream Console.WriteLine(sr.ReadLine()) End While End Using Console.ReadKey()
A výsledek:
Třída File
.NET framework v sobě obsahuje statickou třídu File
s
předpřipravenými metodami, které práci se StreamReader
a
StreamWriter
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
):
Dim radky() As String = File.ReadAllLines("soubor.txt") For Each radka As String In radky Console.WriteLine(radka) Next
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
nalezneme i další podobné metody jako
WriteAllLines(poleStringu, cestaKSouboru)
nebo
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.
To vše si ukážeme příště, Uložení objektů do CSV ve VB.NET.