September discount week
Pouze tento týden sleva až 80 % na e-learning týkající se MS Office
50 % bodů zdarma na online výuku díky naší Slevové akci!

3. diel - Práca s textovými súbormi vo VB.NET

V minulom dieli seriálu tutoriálov pre VB.NET, Úvod do práce so súbormi , sme si ukázali, ako fungujú prístupové práva v systémoch Windows.

Najjednoduchšou cestou, ako uložiť dáta aplikácie na pevný disk, je využiť textové súbory. Sa súbory s príponou .txt ste sa iste všetci už stretli. Text je v nich uložený jednoducho na jednotlivých riadkoch. Na oddelenie riadkov sa využíva špeciálnych znakov, ktoré sú bohužiaľ špecifické pre každý operačný systém. Toto však za nás našťastie vyrieši Visual Basic .NET.

Pozn .: V rôznych materiáloch sa môžete 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ôsobmi, 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ť. Vytvorte si nový projekt (konzolovú aplikáciu) s názvom TextoveSoubory. K zapisovanie do textových súborov nám .NET poskytuje triedu StreamWriter.

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

Using sw As New StreamWriter("soubor.txt")

End Using

Náš StreamWriter je teraz nasmerovaný na správny súbor. Nový riadok zapíšeme pomocou metódy WriteLine. Po dokončení zápise 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.

Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!

Kód sa nám teda rozrástol a môže vyzerať napr. Nasledovne:

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 spustení sa vytvorí file.txt v zložke s naším projektom, presnejšie v bin / debug. Ako sa správne vo VB.NET vysporiadať s cestou k súboru a právami sme si už ukazovali a tu to pre jednoduchosť zanedbáme. Vidíme, že súbor existuje a naozaj obsahuje náš text:

Zápis textových súborov v Visual Basic .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 2. parametra konštruktory objektu StreamWriter. Pokiaľ ho nastavíme na True, vykoná sa tzv. Append (pripísania). Takto do existujúceho súboru pripíšeme nový riadok:

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

Ďalším parametrom môže byť nastavenie kódovania, ale predvolený UTF-8 bude bohato stačiť.

Čí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 podobné, namiesto metódy WriteLine použijeme ReadLine, ktorá vracia riadok textu zo súboru a zároveň sa presunie na riadok nasledujúci. Budeme ju teda volať vo while cyklu. Podmienka pre ošetrenie vyjdenie zo súboru je možná krkolomnejšie, kontrolujeme, či prebehlo priradenie nové riadky do premennej.

Kód k výpisu obsahu súboru do konzoly by vyzeral takto:

Using sr As New StreamReader("soubor.txt")
    While Not sr.EndOfStream
        Console.WriteLine(sr.ReadLine())
    End While
End Using

Vlastnosť EndOfStream udáva či je v prúde ešte niečo ďalej.

Kód celého nášho programu vyzerá teraz 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ýsledok:

Zápis a čítanie textových súborov vo Visual Basic .NET

Nepodporili sme odchytávanie výnimiek a kontrolu práv. Do súborov tiež budeme chcieť väčšinou ukladať skôr objekty, než riadky textu.

To všetko si ukážeme nabudúce, Uloženie objektov do CSV vo VB.NET .


 

Predchádzajúci článok
Úvod do práce so súbormi
Všetky články v sekcii
Súbory a sieť vo Visual Basic .NET
Článok pre vás napísal Michal Žůrek - misaz
Avatar
Ako sa ti páči článok?
Ešte nikto nehodnotil, buď prvý!
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.
Aktivity (1)

 

 

Komentáre

Avatar
Vetva
Člen
Avatar
Vetva:25.12.2013 13:52

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

 
Odpovedať
25.12.2013 13:52
Avatar
Odpovedá na Vetva
Michal Žůrek - misaz:25.12.2013 14:05

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.

 
Odpovedať
25.12.2013 14:05
Avatar
Neaktivní uživatel:1.8.2014 17:27

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

Odpovedať
1.8.2014 17:27
Neaktivní uživatelský účet
Avatar
Odpovedá na Neaktivní uživatel
Neaktivní uživatel:1.8.2014 17:47

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.

Odpovedať
1.8.2014 17:47
Neaktivní uživatelský účet
Avatar
Odpovedá na Neaktivní uživatel
Michael Škrášek:1.8.2014 17:52
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
Odpovedať
1.8.2014 17:52
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!
Avatar
Odpovedá na Neaktivní uživatel
Michael Škrášek:1.8.2014 18:00

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
Odpovedať
1.8.2014 18:00
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Avatar
Michael Škrášek:1.8.2014 19:00

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

Odpovedať
1.8.2014 19:00
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Avatar
Odpovedá na Michael Škrášek
Neaktivní uživatel:1.8.2014 19:18

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

Editované 1.8.2014 19:21
Odpovedať
1.8.2014 19:18
Neaktivní uživatelský účet
Avatar
Vetva
Člen
Avatar
Vetva:4.3.2015 21:34

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

Editované 4.3.2015 21:35
 
Odpovedať
4.3.2015 21:34
Avatar
Odpovedá na Michael Škrášek
Angelidis Aris:5.11.2018 12:02

Lepe je pouzit tento spusob

Try
FileOpen(1, "C:\soubor.txt", OpenMode.Input)
Dim i As Integer = 0
Dim s As String = ""
While Not EOF(1)
i += 1
s = LineInput(1)
If i = 2 Then
MsgBox(s)
Exit While
End If
End While
Catch ex As Exception
MsgBox(ex.ToString)
End Try
FileClose(1)

  1. Nevis kolik radku ma dany archiv
  2. Exit s lupy urychly program
 
Odpovedať
5.11.2018 12:02
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!