aivilon
Goto Top

Vb.net - Löschen einer Bestimmten Zeile

Hallo Zusammen
als erstes, bin schon seit einiger Zeit am googlen. Also verzeiht wenn ich etwas übersehn hab.

Ich hab ein ini file, in welchem in folgender aufstellung Namen und Pfäde von .jar Files drinn stehen:
Name des Jars=c:\Pfad zur JarDatei

dieses ini File wird beim Starten meines Programms ausgelesen. funktioniert auch wunderbar.
Mittels Button möchte ich jetzt ausgewählte (mehrere Möglich) Items im ini File suchen und löschen.

Ich hab folgenden Code:
Private Sub jarDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles jarDelete.Click
    If Me.ListView1.SelectedItems.Count > 0 Then
        For Each item As ListViewItem In ListView1.SelectedItems
            ListView1.Items.Remove(item)

            Dim GanzeZeile As String = ListView1.SelectedItems.ToString
            Dim Sucheninini As String
            Dim inipath As String = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\Mauncher\jars.ini"  
            Dim sr As New StreamReader(inipath)
            Dim sw As StreamWriter
            Dim inicontent As String = sr.ReadToEnd()
            sr.Close()

            MessageBox.Show(GanzeZeile & ", " & inipath & ", " & item.Text & "=" & item.SubItems.Item(1).Text)  

            Sucheninini = item.Text & "=" & item.SubItems.Item(1).Text               
            **inicontent = System.Text.RegularExpressions.Regex.Replace(inicontent, Sucheninini, "")**  
            sw = New StreamWriter(inipath)
            sw.Write(inicontent)
            sw.Close()
        Next
    End If
End Sub

Folgender Fehler tritt in der von den je zwei * eingeschlossenen Zeile auf: "Kopie von MC_2.jar=C:\Dokumente und Einstellungen\b400wyp\Anwendungsdaten\Roaming\.minecraft\bin" wird analysiert - Unbekannte Escape-Zeichenfolge \R.

Was soll das jetzt bedeuten?
Wie bring ich mein Vorhaben hin?

Danke für Hilfe
Grüsse
aivilon

Content-ID: 184950

Url: https://administrator.de/contentid/184950

Ausgedruckt am: 18.11.2024 um 03:11 Uhr

AndreasHoster
AndreasHoster 14.05.2012 um 11:39:11 Uhr
Goto Top
Das bedeutet, das die Regex.Replace Funktion mit den Parametern nicht zufrieden ist, die Du übergibst.
Was haben denn INICONTENT und SUCHENININI für einen Wert, wenn der Fehler kommt?
bastla
bastla 14.05.2012 um 12:24:53 Uhr
Goto Top
... und: Braucht es für dieses Vorhaben überhaupt "Regex", oder genügt vielleicht schon ein simples "Replace" (wie zB hier gezeigt?

Grüße
bastla
aivilon
aivilon 14.05.2012 um 12:41:57 Uhr
Goto Top
Zitat von @AndreasHoster:
Das bedeutet, das die Regex.Replace Funktion mit den Parametern nicht zufrieden ist, die Du übergibst.
Was haben denn INICONTENT und SUCHENININI für einen Wert, wenn der Fehler kommt?

in inicontent: der ganze Inhalt der ini Datei
in Sucheninini: minecraft.jar=C:\Dokumente und Einstellungen\b400wyp\Anwendungsdaten\roaming\.minecraft\bin


Zitat von @bastla:
... und: Braucht es für dieses Vorhaben überhaupt "Regex", oder genügt vielleicht schon ein simples
"Replace" (wie zB hier gezeigt?

Grüße
bastla

Es reicht ja. Habs grad getestet. Nur hab ich jetzt das Problem mit den namen, respektive als Beispiel:
Im ini stehen folgende Zeilen
minecraft.jar=C:\Dokumente und Einstellungen\b400wyp\Anwendungsdaten\roaming\.minecraft\bin
oldminecraft.jar=C:\Dokumente und Einstellungen\b400wyp\Anwendungsdaten\roaming\.minecraft\bin
newminecraft.jar=C:\Dokumente und Einstellungen\b400wyp\Anwendungsdaten\roaming\.minecraft\bin

Nach dem löschen sieht das ini file so aus:
{hier ist eine leere Zeile}
old
new

Ich möchte es aber gern, dass nur GENAU minecraft.jar=C:\Dokumente und Einstellungen\b400wyp\Anwendungsdaten\roaming\.minecraft\bin gelöscht wird wenn ich dieses in der listview ausgewählt habe. Ausserdem müssen die leeren zeilen schwinden.

habt ihr eine Idee wie ich den vorhandenen code nun so umbauen kann, damit das wie gewünscht abläuft?

Grüsse
aivilon
AndreasHoster
AndreasHoster 14.05.2012 um 13:41:57 Uhr
Goto Top
Nun ja, die MSDN sagt bei Regex.Replace:
Da der umgekehrte Schrägstrich als Escapezeichen interpretiert wird, muss jeder umgekehrte Schrägstrich mit einem weiteren umgekehrten Schrägstrich als Escapezeichen versehen werden.
Damit müsstes Du vermutlich
Kopie von MC_2.jar=C:\\Dokumente und Einstellungen\\b400wyp\\....
nehmen.
Und wenn Du keine Leerzeilen haben willst, müsste man auch nach das Carriage return & Line Feed Zeichen mit ersetzen.
Laut http://msdn.microsoft.com/de-de/library/az24scfc.aspx ist das Symbol dafür \n
Und da Du auch noch willst, daß es nur dann ersetzt, wenn es von vorne komplett stimmt, würde ich es mal mit folgendem in der sucheninini probieren:
\nminecraft.jar=C:\\Dokumente und Einstellungen\\b400wyp\\Anwendungsdaten\\roaming\\.minecraft\bin
Funktioniert aber nicht, wenn der Wert in der 1. Zeile steht, weil dann es nicht mit \n anfängt.
bastla
bastla 14.05.2012 um 14:49:04 Uhr
Goto Top
... außerdem sollte CR + LF durch "\r\n" abgebildet werden ...

Grüße
bastla
aivilon
aivilon 14.05.2012 um 15:11:19 Uhr
Goto Top
Zitat von @AndreasHoster:
Nun ja, die MSDN sagt bei Regex.Replace:
> Da der umgekehrte Schrägstrich als Escapezeichen interpretiert wird, muss jeder umgekehrte Schrägstrich mit einem
weiteren umgekehrten Schrägstrich als Escapezeichen versehen werden.
Damit müsstes Du vermutlich
> Kopie von MC_2.jar=C:\\Dokumente und Einstellungen\\b400wyp\\....
nehmen.

Jo. ohne Regex und nur mit Replace funktionierts. aber eben nach dem im vorherigen Post geschriebenem muster.

Und wenn Du keine Leerzeilen haben willst, müsste man auch nach das Carriage return & Line Feed Zeichen mit ersetzen.
Laut http://msdn.microsoft.com/de-de/library/az24scfc.aspx ist das Symbol dafür \n
Und da Du auch noch willst, daß es nur dann ersetzt, wenn es von vorne komplett stimmt, würde ich es mal mit folgendem
in der sucheninini probieren:
> \nminecraft.jar=C:\\Dokumente und Einstellungen\\b400wyp\\Anwendungsdaten\\roaming\\.minecraft\bin
Funktioniert aber nicht, wenn der Wert in der 1. Zeile steht, weil dann es nicht mit \n anfängt.

es muss doch eine Möglichkeit geben, wie ich eine ganze Zeile restlos (also auch ohne zurückbleibendem Zeilenumbruch) löschen kann, und es sollte doch ebenfalls möglich sein, eine Zeile nur dann zu löschen, wenn sie genau wie die angegebene Zeile ist. face-confused
aivilon
aivilon 14.05.2012 um 15:15:09 Uhr
Goto Top
HMPF....ich könnt heulen :'-(

Immer wieder speicher ich meine Projektmappe...jetzt hatte Visual Studio grad voll den hänger, ist abgestürzt und meine Projektmappe hat den Stand von letztem Freitag :'-(

8 Stunden Arbeit im A***

NOOOOOOO


#Edit

WUUUHUUUU .... habs nur vom stick geöffnet und nicht von da wo ich es eigentlich dachte...JUhuuu x))))))

also demnach weiter im Kontext.
AndreasHoster
AndreasHoster 14.05.2012 um 16:55:59 Uhr
Goto Top
Es gibt bei Regex noch den Anker (auch von http://msdn.microsoft.com/de-de/library/az24scfc.aspx)
Also nächster Versuch wäre:
^minecraft.jar=C:\\Dokumente und Einstellungen\\b400wyp\\Anwendungsdaten\\roaming\\.minecraft\bin\r\n
bastla
bastla 14.05.2012 um 18:00:19 Uhr
Goto Top
Hallo aivilon und AndreasHoster!

Anderer Ansatz (allerdings nicht vor Eleganz strotzend face-wink) - schematisch etwa so:
  • die gesamte Ini-Datei per ".Split(vbCrLF)" in ein Array einlesen,
  • dieses per Schleife durchgehen,
  • jede Zeile auf das Vorhandensein des Suchbegriffes prüfen ("InStr()"),
  • wenn gefunden, den Zeileninhalt durch "" ersetzen,
  • am Ende ein ".Join(vbCrLf)" sowie
  • in einer weiteren Schleife solange ".Replace(vbCrLf & vbCrLf, vbCrLf)", bis es keine 2 aufeinanderfolgenden Zeilenschaltungen mehr gibt

Grüße
bastla
Biber
Biber 14.05.2012 um 18:52:13 Uhr
Goto Top
[OT]

Zitat von @aivilon:
HMPF....ich könnt heulen :'-(

meine Projektmappe hat den Stand von letztem Freitag :'-(

8 Stunden Arbeit im A***

^minecraft.jar=C:\\Dokumente und Einstellungen\\b400wyp\\Anwendungsdaten\\roaming\\.minecraft\bin\r\n

Öhhm? Minecraft-Projektmappe???
8 Stunden verbrannt?
Den ganzen Montach mit Spitzhacke verdaddelt? Im Büro???

Und dein Cheffe spielt mit ????

Falls nicht -> ich hoffe, er kennt deinen Nick nicht...

Grüße
Biber
[OT]
aivilon
aivilon 14.05.2012 um 20:05:00 Uhr
Goto Top
Hallo Bieber

Da ich eher der typ bin, der solche sachem mittels tun und nich lesen lernt begann ich mit einem kleinen Projekt, welches nich schön programmiert sein muss. Ich möchte nicht gleich codes ausführen, welche ins produktive netz greiffen. Und da ich die befehle etc. Noch nicht kenne etc, wäre mir das risiko zu hoch zum etwas anstellen.

Deshalb einfach eine fiktive arbeitsmappe.

Wobei anzumerken ist dass ich dies nebenbei mache. Hauptsächlich hab ich eine arbeitsmappe, welche meine administration zusammenfass. Aber eben, jedesmal bei was neuem mach ich das zuerst in dieser mappe

Grüsse
Aivilon
AndreasHoster
AndreasHoster 15.05.2012 um 08:53:24 Uhr
Goto Top
@bastla
So hätte ich es selber auch gemacht, allerdings hätte ich kein Join am Schluss gemacht, sondern den Array per Schleife durchgegangen und jeden Index, der was enthalt in die Datei geschrieben und leere weggelassen.

Aber mit Regexen rumzuspielen schadet auch nicht, die kann man sicherlich auch irgendwann mal wieder brauchen.
Vorallem lassen sich manche Sachen elegant mit Regexen lösen, nur brauche ich meistens länger die Expression zusammenzubasteln als es unschön zu lösen.
bastla
bastla 15.05.2012 um 09:36:16 Uhr
Goto Top
@AndreasHoster
nur brauche ich meistens länger die Expression zusammenzubasteln als es unschön zu lösen.
... was auch die Überlegung hinter meinem Vorschlag war ... face-wink

Grüße
bastla
aivilon
aivilon 15.05.2012 um 10:13:40 Uhr
Goto Top
werds später mal ausprobieren und morgen dann bescheid geben.

vorerst schon mal danke an alle =)