3. díl - Práce s textovými soubory ve VB.NET

Ostatní jazyky Visual Basic .NET Práce se soubory Práce s textovými soubory ve VB.NET

V minulém dílu seriálu tutoriálů pro VB.NET 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:

Zápis textových souborů v Visual Basic .NET

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:

Zápis a čtení textových souborů ve Visual Basic .NET

Opominuli jsme 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ě.


 

  Aktivity (1)

Článek pro vás napsal Michal Žůrek (misaz)
Avatar
Autor se věnuje tvorbě aplikací pro počítače, mobilní telefony, mikroprocesory a tvorbě webových stránek a webových aplikací. Nejraději programuje ve Visual Basicu a TypeScript. Ovládá HTML, CSS, JavaScript, TypeScript, C# a Visual Basic.

Jak se ti líbí článek?
Celkem (3 hlasů) :
55555


 


Miniatura
Předchozí článek
Úvod do práce se soubory
Miniatura
Všechny články v sekci
Práce se soubory v Visual Basic .NET
Miniatura
Následující článek
Uložení objektů do CSV ve VB.NET

 

 

Komentáře

Avatar
Vetva
Člen
Avatar
Vetva:

Aký je rozdiel medzi :
Using sr As New StreamReader("sou­bor.txt")
a
Dim sr As StreamReader("sou­bor.txt")
okrem toho, že pri Dim je nutné volať:
sr.Close

 
Odpovědět 25.12.2013 13:52
Avatar
Odpovídá na Vetva
Michal Žůrek (misaz):

skoro žádný, každopádně Using se doporučuje protože i zabraňuje memory leakům, kdežto ta varianta s Dim paměť vyčistí až v okamžiku kdy voláš Close.

Odpovědět 25.12.2013 14:05
Nesnáším {}, proto se jim vyhýbám.
Avatar
Neaktivní uživatel:

Jak mám nastavit aby se přečetl POUZE 2. řádek ? za radu předem děkuji :)

Odpovědět 1.8.2014 17:27
Neaktivní uživatelský účet
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Neaktivní uživatel
Jiří Gracík:

Jednou zavoláš metodu Readline jen tak a pak jí teprve uložíš. Možná to jde i lépe, ale to ti bohužel neporadím.

Odpovědět 1.8.2014 17:47
Creating websites is awesome till you see the result in another browser ...
Avatar
Odpovídá na Neaktivní uživatel
Michael Škrášek:
Imports System.IO

Module Module1

    Sub Main()
        Using sr As StreamReader = New StreamReader("soubor.txt")
            For i = 1 To 10
                Dim line = sr.ReadLine()
                If i = 2 Then
                    Dim potrebny_radek = line
                End If
            Next
        End Using

    End Sub

End Module
Odpovědět  -1 1.8.2014 17:52
Proč to dělat složitě, když to jde jednoduše.
Avatar
Odpovídá na Neaktivní uživatel
Michael Škrášek:

Nebo jak říkal Jiří Gracík (FunebrakCZ)

Imports System.IO

 Module Module1

     Sub Main()
         Using sr As StreamReader = New StreamReader("soubor.txt")
             sr.ReadLine()
             Dim line = sr.ReadLine()
         End Using

     End Sub

 End Module
Odpovědět  +2 1.8.2014 18:00
Proč to dělat složitě, když to jde jednoduše.
Avatar
Michael Škrášek:

Myslím že je 1. možnost lepší protože se dá využít dobře u funkce. Ve VB to neumím, ale v C# by to mohlo být nějak takto:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.IO;

namespace ConsoleApplication4
{
    class Program
    {
        static string radek;
        static void Main(string[] args)
        {
            potrebny_radek(10);
            Console.WriteLine(radek);
            Console.ReadKey();
        }

        static void potrebny_radek(int cislo_radku)
        {
            StreamReader sr = new StreamReader(@"soubor.txt");
            string line;
            int i = 0;
            while ((line = sr.ReadLine()) != null)
            {
                i++;
                if (i == cislo_radku)
                {
                    radek = line;
                }
            }
        }
    }
}

Zmínil jsem to proto, že jsem dostal i-- a obhajujuse :D

Odpovědět 1.8.2014 19:00
Proč to dělat složitě, když to jde jednoduše.
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Michael Škrášek
Jiří Gracík:

Našel jsem lepší variantu jak obě naše :)!

public string GetLine(int line){

  return File.ReadLines(FileName).Skip(line - 1).Take(1).First();
}

// line je číslo řádku, které chceme

Editováno 1.8.2014 19:21
Odpovědět  +1 1.8.2014 19:18
Creating websites is awesome till you see the result in another browser ...
Avatar
Vetva
Člen
Avatar
Vetva:

A ako vymazať len napr. 2 riadok ? Že by prepis celého súboru ?

Editováno 4.3.2015 21:35
 
Odpovědět 4.3.2015 21:34
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.