Načítání txt souboru a zapisování do něho   otázka

VB.NET, I/O operace

Dobrý den, měl bych otázku na IO.StreamReader a IO StreamWriter.

Přes streamreader otevírám txt soubor pro čtení a zahauju ve while jeho výpis po řádcích, dále mám ve while podmínku že pokud nějaký z těch řádků se bude roven nějakýmu textu tak se to zapíše do toho samého souboru. Nicméně s tímto zapsáním mám problém, protože po kompilaci mi to píše, že ten soubor je již používaný tím streamreader. Měli byste nějaký typ, jak to udělat?

Předem děkuji za odpovědi

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Je používaný již tím IO.StreamReader - tedy dokud ho neuzavřete (.close()) nemůžete zapisovat... Já bych si definoval nějakou proměnou (dim text as string), kterou bych pak pomocí IO.StreamWriter vložil do souboru.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Dobrý den, moc nechápu jak to myslíte, jsem tak trochu začátečník.

Mohl byste to prosím upřesnit. Zde je kód, ve kterém potřebuju abych mohl ve stejné chvíli číst tak i zapisovat.

Dim otevreni_log As System.IO.StreamReader
            Dim uziv_log As String
            Dim datum_log As String
            Dim rozdeleni_log() As String
            Dim datum_dnes As String = Date.Now.ToString("dd.MM.yyyy")
            Dim cas_dnes As String = DateTime.Now.ToString("HH:mm")


            Dim xRead As System.IO.StreamReader
            Dim user, pass As String
            Dim rozdeleni() As String
            xRead = File.OpenText("user.txt")

            While Not xRead.EndOfStream
                rozdeleni = xRead.ReadLine.Split(":")
                user = rozdeleni(0)
                pass = rozdeleni(1)
                If jmeno.Text = user And heslo.Text = pass Then

                    If jmeno.Text = "romana" Or jmeno.Text = "michala" Or jmeno.Text = "renda" Then
                        otevreni_log = File.OpenText("log.txt")
                        While Not otevreni_log.EndOfStream
                            rozdeleni_log = otevreni_log.ReadLine.Split("-")
                            uziv_log = rozdeleni_log(0)
                            datum_log = rozdeleni_log(1)
                            If uziv_log = jmeno.Text And datum_log = datum_dnes Then
                                Dim log_zapis As New IO.StreamWriter("log.txt")
                                log_zapis.WriteLine(jmeno.Text & "-" & datum_dnes & "-" & cas_dnes & "- neplatný pokus o přihlášení")
                                log_zapis.Close()
                                jmeno.Text = ""
                                heslo.Text = ""
                                vysledek.Visible = True
                                vysledek.Text = "Dnes jste již byl(a) přihlašen(a)."
                            Else
                                Dim log_zapis As New IO.StreamWriter("log.txt")
                                log_zapis.WriteLine(jmeno.Text & "-" & datum_dnes & "-" & cas_dnes)
                                log_zapis.Close()
                                Form1.user.Text = jmeno.Text
                                jmeno.Text = ""
                                heslo.Text = ""
                                vysledek.Visible = False
                                Form1.ShowDialog()
                            End If
                        End While
                        otevreni_log.Close()
                    Else
                        Dim log_zapis As New IO.StreamWriter("log.txt")
                        log_zapis.WriteLine(jmeno.Text & "-" & datum_dnes & "-" & cas_dnes)
                        log_zapis.Close()
                        Form1.user.Text = jmeno.Text
                        jmeno.Text = ""
                        heslo.Text = ""
                        vysledek.Visible = False
                        Form1.ShowDialog()
                    End If

                Else

                    If zavreni.Text <> "po_prihlaseni" And vysledek.Text <> "Dnes jste již byl(a) přihlašen(a)." Then
                        vysledek.Visible = True
                        vysledek.Text = "Chybné heslo nebo jméno."
                    End If

                End If
            End While
            zavreni.Text = ""
            xRead.Close()

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Obecně číst a upravovat soubor najednou není úplně ideální. Nejde to třeba zapsat do nějakého dočasného souboru a tím pak nahradit ten původní? Anebo si to skládat do paměti (lepší než do Stringu je StringBuilder, je to rychlejší) a zapsat až po přečtení a zavření původního souboru, což ale nemusí být vhodné, pokud je soubor velký.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky všem za rady. Už to fachá jak potřebuju.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Dobrý den, měl bych ještě otázku.

Potřebuju do toho txt zapsat řádek, což se mi povede, ale smaže se mi ten starý záznam který už tam byl.

Zkus jsem

log_zapis.WriteLine(vbNewLine & text_log_zapis)

A stejně mi to přepíše celý ten text, přitom "vbNewLine" funguje jako další řádka.

Měl byste někdo nějakou radu?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mělo by stačit použít přetížení metody

Dim log_zapis As New IO.StreamWriter("log.txt", True)

Jinou možností je použít metodu AppendText, která přidá řádky do již existujícího souboru.

Př.

Dim sw As StreamWriter
sw = File.AppendText(path)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den, tak snad už do tohoto tématu píšu naposledy.

Mám zase problém, včera mi to fachalo a dnes ne.

If jmeno.Text.Length > 0 And heslo.Text.Length > 0 Then

            Dim otevreni_log As System.IO.StreamReader = File.OpenText("log.txt")
            Dim uziv_log, datum_log As String
            Dim rozdeleni_log() As String
            Dim datum_dnes As String = Date.Now.ToString("dd.MM.yyyy")
            Dim cas_dnes As String = DateTime.Now.ToString("HH:mm")
            Dim text_log_zapis As String = ""
            Dim dlouhodoby_log As String = ""
            Dim dlouhodoby_log_zapis As New IO.StreamWriter("dlouhodoby_log.txt", True)


            Dim nacteni_uziv As System.IO.StreamReader = File.OpenText("user.txt")
            Dim user, pass As String
            Dim skupina As Integer
            Dim rozdeleni() As String

            While Not nacteni_uziv.EndOfStream
                rozdeleni = nacteni_uziv.ReadLine.Split("-")
                user = rozdeleni(0)
                pass = rozdeleni(1)
                skupina = rozdeleni(2)

                If user.Length > 0 And pass.Length > 0 And skupina > 0 Then

                    If jmeno.Text = user And heslo.Text = pass Then

                        If skupina = 1 Then

                            dlouhodoby_log = jmeno.Text & "-" & datum_dnes & "-" & cas_dnes
                            dlouhodoby_log_zapis.WriteLine(dlouhodoby_log)
                            Form1.user.Text = jmeno.Text
                            Form1.skupina.Text = skupina
                            heslo.Text = ""
                            vysledek.Visible = False
                            Form1.ShowDialog()

                        End If
                        If skupina >= 2 Then

                            While Not otevreni_log.EndOfStream
                                rozdeleni_log = otevreni_log.ReadLine.Split("-")
                                uziv_log = rozdeleni_log(0)
                                datum_log = rozdeleni_log(1)


                                If jmeno.Text = uziv_log And datum_dnes = datum_log Then

                                    dlouhodoby_log = jmeno.Text & "-" & datum_dnes & "-" & cas_dnes & " - už byl(a) přihlašen(a)"
                                    dlouhodoby_log_zapis.WriteLine(dlouhodoby_log)
                                    vysledek.Visible = True
                                    vysledek.Text = "Dnes jste již byl(a) přihlašen(a)."
                                    heslo.Text = ""

                                End If


                            End While
                            otevreni_log.Close()
                            If vysledek.Text <> "Dnes jste již byl(a) přihlašen(a)." Then

                                dlouhodoby_log = jmeno.Text & "-" & datum_dnes & "-" & cas_dnes
                                dlouhodoby_log_zapis.WriteLine(dlouhodoby_log)
                                Form1.user.Text = jmeno.Text
                                Form1.skupina.Text = skupina
                                vysledek.Visible = False
                                heslo.Text = ""
                                Form1.ShowDialog()

                            End If


                        End If
                    Else
                        If zavreni.Text <> "po_prihlaseni" And vysledek.Text <> "Dnes jste již byl(a) přihlašen(a)." Then
                            vysledek.Visible = True
                            heslo.Text = ""
                            vysledek.Text = "Chybné heslo nebo jméno."
                        End If
                    End If
                End If

            End While
            nacteni_uziv.Close()
            dlouhodoby_log_zapis.Close()

            zavreni.Text = ""

        Else
            vysledek.Visible = True
            vysledek.Text = "Nebyli vyplněny všechny pole."
        End If

Kouknul byste prosím na to někdo, neustále mi to načítá jen první řádek a nechápu proč.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Našel jsem chybičku ve spodní části

Else
                        If zavreni.Text <> "po_prihlaseni" And vysledek.Text <> "Dnes jste již byl(a) přihlašen(a)." Then
                            vysledek.Visible = True
                            heslo.Text = ""
                            vysledek.Text = "Chybné heslo nebo jméno."
                        End If


Když tyto řádky umažu tak to funguje, ale nevypíše to že se tam dalo špatné jméno nebo heslo. Neměl by někdo nějaký typ?

Předem děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak si to odkrokujte, tím nejlíp zjistíte, co s tím je.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Už to mám, špatně jsem měl udělané podmínky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback