Bestimmten Text löschen per Streamwriter ?!

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von EaranMaleasi.

    Bestimmten Text löschen per Streamwriter ?!

    Hallo,

    habe derzeit ein Problem.Und zwar habe ich eine Listview die sich aus 3 Colums zsm setzt zb Webseite, Benutzer, Passwort
    Der Inhalt wird aus einer TextDatei per StreamReader gelesen und durch Kommas getrennt in die jeweilige Spalte hinzugefügt, der Text sieht dann zb so aus
    WebseitName,Benutzer,Passwort

    Das lesen/schreiben klappt auch wunderbar, jedoch würde ich gern ein lösch funktion einbauen mit der ich das gerade ausgewählt ListviewItem aus der Textdatei löschen kann per Streamwriter oder ähnlichem ? Bin da etwas ratlos wie ich das realisieren soll.

    Danke im voraus
    Mfg
    Du löschst nichts aus der Datei sondern überschreibst diese mit den aktuellen Werten aus deinem ListView.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich versuche es derzeit mit diesem Code

    Spoiler anzeigen
    Try
    AppAccsListView.SelectedItems.Item(0).Remove()
    For Each item As ListViewItem In AppAccsListView.Items
    Dim EncryptedApp As String
    Dim EncrypedUser As String
    Dim EncryptedPass As String
    'Write WebAccounts to File
    fs = New FileStream(sAppPath & "\Data\Keys\Apps.keys", FileMode.Create)
    writer = New StreamWriter(fs)
    'Start Encrypting
    EncryptedApp = Global.Cryptor.Class1.Encrypt(item.Text, My.Settings.ID)
    EncrypedUser = Global.Cryptor.Class1.Encrypt(item.SubItems(1).Text, My.Settings.ID)
    EncryptedPass = Global.Cryptor.Class1.Encrypt(item.SubItems(2).Text, My.Settings.ID)
    'End Encrypting
    writer.WriteLine(EncryptedApp & "," & EncrypedUser & "," & EncryptedPass)
    Next
    'Close(writer)
    writer.Dispose()
    writer.Close()
    fs.Dispose()
    fs.Close()
    Catch ex As Exception
    writer.Dispose()
    writer.Close()
    fs.Dispose()
    fs.Close()
    MessageBox.Show(ex.ToString)
    End Try

    Das ganze klappt aber nur bedingt, den ersten Eintrag in der Textdatei zb lässt sich überhaupt nicht löschen und wenn ich einen Eintrag in der Mitte auswähle bekomme ich eine Fehlermeldung.
    Vllt ne Idee was falsch ist an meinem Code ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gutserino“ ()

    Gutserino schrieb:

    Vllt ne Idee was falsch ist an meinem Code ?

    Zwei Dinge auf den ersten Blick:
    1. Poste ganze Methoden - nicht so verlorene Zeilen, die überall und nirgends stehen könnten.
    2. Benutze die Forum-Funktionalität, um Code in lesbarer Form einzustellen (mit Syntax-Colorierung und Einrückungen)

      Code sollte so aussehen - sonst guck ich garnet erst hin:

      VB.NET-Quellcode

      1. Private Sub SaveListview()
      2. Try
      3. AppAccsListView.SelectedItems.Item(0).Remove()
      4. For Each item As ListViewItem In AppAccsListView.Items
      5. Dim EncryptedApp As String
      6. Dim EncrypedUser As String
      7. Dim EncryptedPass As String
      8. 'Write WebAccounts to File
      9. fs = New FileStream(sAppPath & "\Data\Keys\Apps.keys", FileMode.Create)
      10. writer = New StreamWriter(fs)
      11. 'Start Encrypting
      12. EncryptedApp = Global.Cryptor.Class1.Encrypt(item.Text, My.Settings.ID)
      13. EncrypedUser = Global.Cryptor.Class1.Encrypt(item.SubItems(1).Text, My.Settings.ID)
      14. EncryptedPass = Global.Cryptor.Class1.Encrypt(item.SubItems(2).Text, My.Settings.ID)
      15. 'End Encrypting
      16. writer.WriteLine(EncryptedApp & "," & EncrypedUser & "," & EncryptedPass)
      17. Next
      18. 'Close(writer)
      19. writer.Dispose()
      20. writer.Close()
      21. fs.Dispose()
      22. fs.Close()
      23. Catch ex As Exception
      24. writer.Dispose()
      25. writer.Close()
      26. fs.Dispose()
      27. fs.Close()
      28. MessageBox.Show(ex.ToString)
      29. End Try
      30. End Sub

    So, jetzt habichs ja schon anguck-bar gemacht, kann ich auch Senf zu geben:
    Also der gezeigte Code kann eigentlich garnet kompilieren, weil die Variablen fs und writer nirgends deklariert sind.
    Da hätte ich also noch einen 3. Verbesserungsvorschlag: Poste nur Code, der auch kompiliert.
    Bzw. wenn er nicht kompiliert, poste Fehlerzeile und genauen, vollständigen Wortlaut der Fehlermeldung.
    Naja, vielleicht kompiliert er bei dir ja doch, weil bei dir irgendwo diese Variablen deklariert sind.
    Also 4. Vorschlag: Achte beim Posten darauf, dass von allen benutzten Variablen auch die Deklarationen erkennbar sind. D.h. Wortlaut der Deklaration und man muss auch sehen, wo die Deklaration steht.

    Jetzt ein inhaltlicher Vorschlag:
    Mach die Deklarationen innerhalb der gezeigten Methode. Weil derzeit siehts so aus, als ob fs und writer irgendwo in der Klasse deklariert sind. Das wäre schlecht, weil sie gehören in diese Methode hinein.
    Kann aber auch sein, dass sie bereits in der Methode drinne sind - du hast ja nur verlorene Zeilen gepostet, keine vollständige Methode.
    Was wiederum aufzeigt, wie wichtig es ist, Code in richtiger Weise zu posten (lesbar, vollständige Methoden, inkl. Deklarationen,...), wenn man qualifizierte Antworten haben möchte.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Der Spoiler ist nicht Teil der Kritik. Schau Dir Deinen Spoilerinhalt an. Da steht blanker Text drin. Code ohne CodeTags ist schwierig zu verbessern.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Gutserino schrieb:

    Man kann es aber auch niemandem recht machen
    Jo, ich komme sehr leicht bisserl kotzbrocken-mässig rüber, wenn ich fast gar keine Lösung gebe, sondern nur Anforderungen stelle.
    Aber ich meins gut - guckma, wieviel Arbeit ich mir gemacht hab mit dem Post, um dir zu zeigen, wies geht, und um zu begründen, warum und was nicht alles.
    Dass du's niemandem recht machen kannst ist schon klar, bringt aber den Erkenntnisgewinn nicht voran - und geht mir übrigens genauso (achtung: eigentlich bin ich ein Witzbold :P ).

    Und der inhaltliche Teil - meine Nachfrage, wo und wie fs und writer denn deklariert sind - tja, wenn du was lernen willst, musste das beantworten, sonst kanns nicht weiter gehen.

    Ok, dann lösch diese Deklarationen mal alle

    und probier so:

    VB.NET-Quellcode

    1. Private Sub RemoveSelectedAndSaveAppAccesses()
    2. AppAccsListView.SelectedItems.Item(0).Remove()
    3. Using writer = New StreamWriter(sAppPath & "\Data\Keys\Apps.keys")
    4. For Each item As ListViewItem In AppAccsListView.Items
    5. Dim app = Global.Cryptor.Class1.Encrypt(item.Text, My.Settings.ID)
    6. Dim user = Global.Cryptor.Class1.Encrypt(item.SubItems(1).Text, My.Settings.ID)
    7. Dim pw = Global.Cryptor.Class1.Encrypt(item.SubItems(2).Text, My.Settings.ID)
    8. writer.WriteLine(app & "," & user & "," & pw)
    9. Next
    10. End Using
    11. End Sub

    Merkpunkte:
    • Kapselungsprinzip: der writer wird nur in dieser Methode gebraucht, dann soll er nicht als Klassenvariable für alle anderen Methoden sichtbar sein - und schon garnet public.
      Das Kapselungsprinzip besagt, dass jeder Code im Optimalfall nur das "sehen" kann, was er braucht, um seine Arbeit zu tun. Je mehr anderes Zeug ihm sichtbar ist, desto höher die Wahrscheinlichkeit, dass er dran rumfummelt und dadurch andere Abläufe stört, oder durch andere gestört wird.
    • Using-Block: Der Using-Block ruft beim Verlassen writer.Dispose() auf, und das funzt 100% sicher, selbst wenn die Methode vorzeitig verlassen wird - sogar bei Fehlern: Using stellt sicher, dass aufgeräumt wird.
      .Dispose und .Close können dadurch entfallen
    • TryCatch: TryCatch ist ein heißes Eisen (<- folge dem Link!) VisualStudio hat einen wunderbaren Debugger, ein ganz optimales Instrument, um Fehler zu beheben, wenn sie auftreten. TryCatch deaktiviert diesen Debugger - also man schiesst sich nur selbst damit ins Knie.
      Natürlich gibt es Fälle, wo TryCatch sinnvoll ist, die sind aber sehr selten, sind meist überaus aufwändig zu programmieren, und dieses hier ist sicherlich kein solcher Fall.
    • Benamung: Ich habe die Methode genau so benannt wie was sie tut. Da sieht man auch, dass das recht fragwürdig ist. Wäre es nicht besser, man würde nur das ListviewItem löschen, und das Abspeichern in einer anderen Methode erledigen, etwa beim Schliessen der Form? Du sagst, du hättest schon eine Abspeicher-Methode - die könnte man da doch vlt. für verwenden?
      Je weniger code gebraucht wird, und je öfter (der wenige) Code wiederverwendet wird, desto besser.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Danke für die antworten.
    Habe eine möglichkeit gefunden am Ende das ganze zu realisieren.

    Für wens interessiert:
    Spoiler anzeigen

    Quellcode

    1. If AppAccsListView.SelectedIndices.Count <= 0 Then
    2. MessageBox.Show("Nichts ausgewählt zum löschen!", "Fehler")
    3. Else
    4. Try
    5. AppAccsListView.Items(AppAccsListView.SelectedIndices(0)).Remove()
    6. fs = New FileStream(sAppPath & "\Data\Keys\Apps.keys", FileMode.Create)
    7. Using writer As New StreamWriter(fs)
    8. For Each item As ListViewItem In AppAccsListView.Items
    9. Dim Row As String = ""
    10. For Each Cell As ListViewItem.ListViewSubItem In item.SubItems
    11. Row &= Global.Cryptor.Class1.Encrypt(Cell.Text, My.Settings.ID) & ","
    12. Next
    13. Row = Row.Remove(Row.Length - 1, 1)
    14. writer.WriteLine(Row)
    15. Next
    16. 'Close all Ressources
    17. writer.Dispose()
    18. writer.Close()
    19. fs.Dispose()
    20. fs.Close()
    21. End Using
    22. Catch ex As Exception
    23. MessageBox.Show("Eintrag konnte nicht gelöscht werden!", "Fehler")
    24. End Try
    25. End If