VB.net 2005: Streamreader en Streamwriter probleem

Pagina: 1
Acties:

  • aho85
  • Registratie: November 2005
  • Laatst online: 01-12 13:23
Hee,

Ik ben bezig met het schrijven van een stuk code waarbij midden in een .txt file een aantal regels moet worden toegevoegd.

- De eerste drie regels van de file moeten blijven staan
- De nieuwe (uit een aantal txtvakken komende) text moet er onder komen
- Daaronder moet de oude tekst weer gewoon komen te staan.
Voorwaarde: De opmaak moet behouden blijven (enters e.d.)

Ik doe het volgende.

1. Ik declareer m'n variabelen en lees de .txtvelden uit naar de variabelen (gaat goed)
2. Ik creëer 2 streamreaders voor hetzelfde tekstbestand. (gaat goed)
3. De eerste reader laat ik met een loopje het aantal regels van het tekstbestand bepalen (gaat goed)
4. Ik creëer een string array met een grootte gelijk aan het aantal regels van de textfile. (gaat goed)
5. De tweede reader laat ik met een loopje de eerste 3 regels doorlopen zodat de reader op positie vier staat (vanaf regel vier moet de data naar de string array) (gaat goed)
6. Vanaf die vierde regel gaat een andere loop lopen die met streamreader.readline de regels in de string array zet (lijkt ook goed te gaan)
7. ik .Close() en .Dispose() beide streamreaders
8. Ik wis het originele textbestand met my.computer.filesystem.deletefile en maak met de streamwriter m.b.v. file.createtext het tekstbestand opnieuw.
9. Met streamwriter.writeline schrijf ik eerst die eerste 3 regels weer terug in het nieuwe textbestand (gaat goed)
10. Met streamwriter.writeline schrijf ik de nieuwe regels die uit de tekstvakken komen naar het nieuwe textbestand (gaat goed), Hier komen de regels keurig onder elkaar te staan zonder witregels...

En nu komen we op het punt waar het fout gaat.......:
11. Ik ga nu loopen om de oude regels vanuit de string array 1 voor 1 terug te schrijven m.b.v. streamwriter.writeline(). Na iedere regel die ik wegschrijf komt er in het tekstbestand nu een witregel! Blijkbaar een verborgen enter o.i.d. aan het einde van iedere string in de array?. Het is dus de bedoeling dat alle regels in het tekstbestand direct onder elkaar komen te staan zonder witregels...

Bijbehorende code vind je helemaal onder aan het codeblok hieronder. Ik heb me al rot gezocht maar vind geen oplossing. Kan iemand me helpen?

------------ De code ------------

Visual Basic .NET: Default
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
 
'Textfile uitlezen.
        'Eerst readers aanmaken.
        Dim StreamReader As New StreamReader("G:\Alexanderhof.nl\Beheer\weblog.txt")
        Dim StreamTeller As New StreamReader("G:\Alexanderhof.nl\Beheer\weblog.txt")


        'Aantal regels bepalen.
        Try

            While Not IsNothing(StreamTeller.ReadLine)
                regels += 1
            End While
            'misschien nog -3 hier om de array passend te maken..?
        Catch
            MsgBox("Er is een fout opgetreden bij het tellen van het aantal regels van weblog.txt", MsgBoxStyle.Information, "Foutmelding")
        End Try
        Dim strRegel(regels) As String
        'Met de andere lezer de eerste drie regels overlsan
        Try
            For regel As Integer = 0 To 2
                StreamReader.ReadLine()
            Next regel


            'De reader staat nu op regel 4, vanaf hier gaan we loopen om de array te vullen
            For x As Integer = 0 To regels
                strRegel(x) = StreamReader.ReadLine
                'TODO: Hier zorgen dat de regeleindes eruit gaan...
                'MsgBox(strRegel(x))
                x += 1
            Next x
            'MsgBox(strRegel(0))
        Catch
            MsgBox("Er is een fout opgetreden bij het vullen van de string array.", MsgBoxStyle.Information, "Foutmelding")
        End Try

        
        StreamReader.Close()
        StreamTeller.Close()
        StreamReader.Dispose()
        StreamTeller.Dispose()

        'De file wissen
        Try
            My.Computer.FileSystem.DeleteFile("G:\Alexanderhof.nl\Beheer\weblog.txt")
        Catch
            MsgBox("Er is een fout opgetreden bij het wissen van de oude weblog.txt.", MsgBoxStyle.Information, "Foutmelding")
        End Try

        'en direct opnieuw aanmaken & vullen: 
        'TODO: File.CreateText(Server.MapPath(".\Upload\") & "test.txt") implementeren voor dynamisch pad. 
        Try
            Dim StreamWriterWeblog As StreamWriter
            'StreamWriterWeblog = My.Computer.FileSystem.OpenTextFileWriter("G:\Alexanderhof.nl\Beheer\weblog.txt", True)
            StreamWriterWeblog = File.CreateText("G:\Alexanderhof.nl\Beheer\weblog.txt")
            StreamWriterWeblog.WriteLine(strXML)
            StreamWriterWeblog.WriteLine(strRSS)
            StreamWriterWeblog.WriteLine(strChannel)
            StreamWriterWeblog.WriteLine(strItemOpen)
            StreamWriterWeblog.WriteLine(strTitel)
            StreamWriterWeblog.WriteLine(strDoor)
            StreamWriterWeblog.WriteLine(strDatumTijd)
            StreamWriterWeblog.WriteLine(strBericht)
            StreamWriterWeblog.WriteLine(strItemClose)
            'loopen om de oude regels weer terug te schrijven.. 
            For i As Integer = 0 To regels
                StreamWriterWeblog.WriteLine(strRegel(i))
            Next
            StreamWriterWeblog.Close()
            StreamWriterWeblog.Dispose()
        Catch
            MsgBox("Er is een fout opgetreden bij het creeren van de update op weblog.txt", MsgBoxStyle.Information, "Foutmelding")
        End Try

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Ik vind dat je op een rare manier te werk gaat. :P
Waarom 2 readers, waarom het originele bestand wissen en opnieuw schrijven ?

Waarom niet zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FileStream fs = new FileStream ( .... ); // Filestream naar originele bestand.
FileStream destFs = new FileStream ( .... ); // Filestream voor nieuw bestand.

StreamReader reader = new StreamReader (fs);
StreamWriter writer = new StreamWriter (destFs);

int counter = 0;
while( reader.Peek() != -1 )
{
    if( counter == 3 )
    {
         writer.WriteLine ("nieuwe lijnen.");
    }
    string line = reader.ReadLine ();
    writer.WriteLine (line);
    counter++;
}


Daarna kan je het originele bestand wissen, en je nieuwe bestand hernoemen.

Maar, als je het toch op je eigen manier wil doen, kan je eens proberen om de lijn te trimmen alvorens je ze wegschrijft.
code:
1
writer.WriteLine (strRegel[i].Trim());

[ Voor 4% gewijzigd door whoami op 04-02-2007 12:38 ]

https://fgheysels.github.io/


  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 15:07
Dat komt omdat writeLine() ook een newline wegschrijft. In je textboxen staat achter elke regel ook een newline, dit betekent dat er twee newlines worden geschreven. Je kunt gewoon write() gebruiken om de hele string ineens weg te schrijven naar het bestand.

Vergeet overigens niet om een flush() te doen, anders kan het zijn dat je op het eind data mist.

Ik zou het trouwens anders doen, want je leest het hele bestand in in je geheugen, wat totaal niet nodig is:

1) Open het bestaande bestand met een StreamReader
2) Maak een nieuw tijdelijk bestand aan met een StreamWriter
3) Lees 3 regels in van het originele bestand met readLine() en schrijft die direct weg in het tijdelijke bestand met writeLine()
4) Schrijf de inhoud van de textboxen weg met write() waardoor de tekst 1 op 1 in het nieuwe bestand komt
5) schrijf de rest van het bestand weg met iets als dit (let op: ik heb geen VB ervaring whatsoever, dit komt uit MSDN):
Visual Basic .NET:
1
2
3
4
Do
    line = sr.ReadLine()
    sw.WriteLine(Line)
Loop Until line Is Nothing

6) flush() en close() het bestand.
7) Verwijder het orginele bestand
8) Hernoem het tijdelijke bestand naar het originele bestand.

offtopic:
Grrr, zit ik een heel verhaal te typen :( ;)

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett