Regel verwijderen .txt

Status
Niet open voor verdere reacties.

Pim15

Gebruiker
Lid geworden
18 mrt 2012
Berichten
257
Ik heb een TabControl die de tabbladen inleest van een .txt bestand. Als ik een tab wil verwijderen moet in het .txt die regel ook worden verwijderd. Hoe doe ik dit?

Pim
 
Je moet aan zoiets denken:

[cpp]Private Sub VerwijderTabPage(ByVal naam As String)
''//Controleer of tabpage bestaat
For Each TP As TabPage In TabControl1.TabPages
If TP.Name = naam Then
''//Verwijder
TabControl1.TabPages.Remove(TP)
''//Verwijder ook uit bestand
''//ik veronderstel de volgende indeling: x;y;z
''//Voor het gemak neem ik een variabele i.p.v. een echt bestand
''//Het inlezen en wegschrijven kun je waarschijnlijk zelf
Dim bestand As String = "TabPage1;TabPage2;TabPage3"
For Each item As String In bestand.Split(";")
If item = naam Then
item.Replace(naam, "")
Exit For
End If
Next
Exit For
End If
Next
End Sub[/cpp]
 
Het .txt bestand is als volgt ingedeeld:
Tabblad1
Tabblad2
Tabblad3
Jouw code werkt nu niet. Ik heb het ook al aangepast, maar dan lukt het mij nog steeds niet.

Pim
 
Hoi,

Ik doe het meestal ongeveer zo:
[CPP]Dim Bestand As String = "Bestandspath & naam"
Dim StorageString As String = "De te zoeken regel" ''//misschien een beetje rare naam, maar dat komt omdat het uit een van mijn projecten is geplukt
Dim LstInhoud As New List(Of String) ''//Hier de resultaten in schrijven zodat het lezen van het bestand minder lang duurt

If Not File.Exists(Bestand) Then
MsgBox("Bestand mist")
Exit Sub
End If

Dim Stream As New FileStream(Bestand, FileMode.Open)
Dim Reader As New StreamReader(Stream)
While Not Reader.EndOfStream
LstInhoud.Add(Reader.ReadLine) ''//Bestand lezen en resultaten zetten in de list
End While
Reader.Close()
Stream.Close()

''//De hele inhoud in een array zetten
Dim Inhoud() As String = LstInhoud.ToArray
Dim EindInhoud As New List(Of String)

''// alle regels doorlopen en alleen de verkeerde eruit halen
For i As Integer = 0 To Inhoud.Count - 1 Step 1
If Not Inhoud(i) = StorageString Then
EindInhoud.Add(Inhoud(i))
End If
Next

''//1 string van maken
Dim EindInhoud1() As String = EindInhoud.ToArray
Dim EindInhoud2 As String = Nothing
For i As Integer = 0 To EindInhoud1.Count - 1 Step 1
EindInhoud2 &= EindInhoud1(i) & vbNewLine
Next

''//Alles weer wegschrijven, met truncate
Dim Stream As New FileStream(Bestand, FileMode.Truncate)
Dim Writer As New StreamWriter(Stream)
Writer.Write(EindInhoud2)
Writer.Close()
Stream.Close()[/CPP]

Er zouden kleine foutjes in kunnen zitten omdat ik het even snel uit een oud project heb geplukt :D

MartinJM
 
Er zitten inderdaad wat fouten in, en ik snap de code ook niet, dus kan ik ook niet proberen de fouten eruit te halen. Ik zit hier nog steeds mee te stoeien.

Pim
 
Hoi,

Je moet 'System.IO' importeren. Dan heb je nog een foutmelding over die je kan oplossen door de tweede FileStream "stream1" te noemen. De naam moet je dan ook bij de writer aanpassen.

Voorbeeld:
[CPP]Imports System.IO

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Bestand As String = "C:\Users\[User]\Test.txt"
Dim StorageString As String = "verwijderen" ''//de zoekstring misschien een beetje rare naam, maar dat komt omdat het uit een van mijn projecten is geplukt
Dim LstInhoud As New List(Of String) ''//Hier de resultaten in schrijven zodat het lezen van het bestand minder lang duurt

If Not File.Exists(Bestand) Then
MsgBox("Bestand mist")
Exit Sub
End If

Dim Stream As New FileStream(Bestand, FileMode.Open)
Dim Reader As New StreamReader(Stream)
While Not Reader.EndOfStream
LstInhoud.Add(Reader.ReadLine) ''//Bestand lezen en resultaten zetten in de list
End While
Reader.Close()
Stream.Close()

''//De hele inhoud in een array zetten
Dim Inhoud() As String = LstInhoud.ToArray
Dim EindInhoud As New List(Of String)

''// alle regels doorlopen en alleen de verkeerde eruit halen
For i As Integer = 0 To Inhoud.Count - 1 Step 1
If Not Inhoud(i) = StorageString Then
EindInhoud.Add(Inhoud(i))
End If
Next

''//1 string van maken
Dim EindInhoud1() As String = EindInhoud.ToArray
Dim EindInhoud2 As String = Nothing
For i As Integer = 0 To EindInhoud1.Count - 1 Step 1
EindInhoud2 &= EindInhoud1(i) & vbNewLine
Next

''//Alles weer wegschrijven, met truncate
Dim Stream1 As New FileStream(Bestand, FileMode.Truncate)
Dim Writer As New StreamWriter(Stream1)
Writer.Write(EindInhoud2)
Writer.Close()
Stream.Close()
End Sub
End Class
[/CPP]

MartinJM
 
Laatst bewerkt:
Het werkt nog steeds niet. Ik heb zelf ook al dit in elkaar geflanst:
Code:
If TabControl1.TabPages.Count = 0 Then
        Else
            TabControl1.TabPages.Remove(TabControl1.SelectedTab)
            Dim path As String = "Tabbladen.txt"
            Dim streamReader As New System.IO.StreamReader(path)
            '
            Do Until streamReader.EndOfStream
                ' Reading Line by Line :
                Dim line As String = streamReader.ReadLine()
                Console.WriteLine(line)
                If line = TabControl1.SelectedTab.Text Then
                Else
                    Dim path2 As String = "Tijdelijke opslag tabbladen.txt"
                    Dim streamWriter As New System.IO.StreamWriter(path2)
                    '
                    streamWriter.WriteLine(line)
                    '
                    streamWriter.Close()
                End If
            Loop
            streamReader.Close()
            '
            Console.ReadLine()

            Dim path3 As String = "Tabbladen.txt"
            Dim streamWriter3 As New System.IO.StreamWriter(path3)
            '
            [U][B]Hier moet het programma de tekst van Tijdelijke opslag tabbladen.txt lezen.[/B][/U]
            '
            streamWriter3.Close()
            My.Computer.FileSystem.DeleteFile("Tijdelijke opslag tabbladen.txt")
        End If
Alleen bij het lezen van de tekst in Tijdelijke opslag tabbladen.txt moet het werken. Werkt dit ook?

Pim

EDIT: Volgens mij weet ik al hoe het moet.
EDIT2: Nee, toch niet.
 
Laatst bewerkt:
Wat wil je precies? Je code is een beetje moeilijk te begrijpen... Als ik het goed begrijp is het een console application (Console.ReadLine), die een tabcontrol met tabbladen heeft?
Vervolgens heb je een streamreader die je het bestand regel voor regel moet uilezen, en als de lijn hetzelfde is als het geselecteerde tabblad (wat je bovenaan verwijderd), dan moet er niks geschreven worden. Anders wel.
Dan wacht je op een input van de gebruiker, die je niet gebruikt, en je maakt nog een streamwriter aan waarmee je het bestand uit wil gaan lezen. Aan het eind verwijder je het bestand.

Klopt dat? En is dat ook wat je wil?

MartinJM
 
Laatst bewerkt:
Dat klopt, aan het einde wordt het bestand weer uitgelezen om in Tabbladen.txt te zetten, want ik lees mijn tabbladen uit Tabbladen.txt. Maar hoe bedoel je met input van de gebruiker?

Pim
 
Het is als er fouten optreden altijd wel fijn als je de foutmeldingen aangeeft.
 
Met input van de gebruiker bedoel ik dit: "Console.ReadLine()"

Maar waarom gebruik je het tijdelijke bestand als dat ook met een variable kan?
 
Onderaan dit toevoegen:
[CPP]TabControl1.TabPages.Remove(TabControl1.SelectedTab)[/CPP]

Of opnieuw alles uitlezen en erin zetten...

MartinJM
 
Het laatste werkt ook niet, maar ik stop ook met dit project en ga iets ander maken.

Pim
 
Waarom opgeven? Dit is juist heel makkelijk:

6kReHJA.png

Download.
 
Dit is perfect. Heel erg bedankt voor jullie hulp.

Pim
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan