Inhalt einer Datei auslesen, verändern, schreiben

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Dasive.

    Inhalt einer Datei auslesen, verändern, schreiben

    Ich möchte den Inhalt einer Datei, welche anscheinend keine Erweiterung hat (Hab "Erweiterungen bei bekannten Dateitypen ausblenden" ausgeschaltet, Eigenschaften sagen "Datei") auslesen, Werte durch neue ersetzen und dann wieder schreiben.

    Es handelt sich um ein Battlefield 3-Savefile das In-Game Einstellungen enthält (gibt es hier im Forum eine Möglichkeit die hochzuladen?). Es wird lediglich ein FOV (FieldOfView-Winkel, Breite des Sichtfelds) verändert, dass ist bei den meisten Spielen ohnehin möglich, dass ist legal.
    Mit Notepad2 ist das öffnen, bearbeiten und speichern kein Problem, dass Spiel startet einwandfrei.

    Wird es aber über meine Software erledigt stürzt das Spiel beim Programmstart gleich wieder ab, Battlefield 3 funktioniert nicht mehr.
    Das die Datei keine Erweiterung hat verwirrt mich ein wenig, kenne mich damit nicht aus.

    Hier mal die betreffenden Codezeilen:

    VB.NET-Quellcode

    1. Private Sub load_bf_settings()
    2. read_bf_settings()
    3. dec_battlefield_profile_fov = read_battlefield_profile_setting(My.Settings.str_bf_fov_setting_name)
    4. End Sub
    5. Private Sub save_settings() Handles btn_save.Click
    6. Try
    7. save_setting(My.Settings.str_bf_fov_setting_name, dec_battlefield_profile_fov, nup_fov.Value)
    8. MsgBox("Settings succesfully saved!")
    9. Catch ex As Exception
    10. End Try
    11. End Sub
    12. Private Sub save_setting(ByVal setting_name As String, ByVal old_value As Decimal, ByVal new_value As Decimal)
    13. Try
    14. read_bf_settings()
    15. str_settings = str_settings.Replace(setting_name & " " & old_value, setting_name & " " & new_value)
    16. My.Computer.FileSystem.WriteAllText(My.Settings.str_bf_profile_path, str_settings, False)
    17. Catch ex As Exception
    18. f_error_message.show_error_message("", "", ex.ToString)
    19. End Try
    20. End Sub
    21. Private Sub read_bf_settings()
    22. Try
    23. str_settings = My.Computer.FileSystem.ReadAllText(My.Settings.str_bf_profile_path)
    24. Catch ex As Exception
    25. End Try
    26. End Sub

    Zusatzinfo:
    - My.Settings.str_bf_fov_setting_name = GstRender.FieldOfView
    - My.Settings.str_bf_profile_path = C:\Users\Dimitri\Documents\Battlefield 3\settings\PROF_SAVE_profile (wird dann noch auf die verschiedenen User angepasst)
    - Die Variablen sind Global

    /edit
    Werte der Settings vergessen
    Lass die

    VB.NET-Quellcode

    1. My.Computer.
    Scheisse. Ist mit das Schlimmste was man machen kann.
    Von

    VB.NET-Quellcode

    1. MsgBox
    solltest Du auch die Finger lassen.

    Und hau verdammt nochmal die scheiss Try Catch Blöcke aus deinem Code, wie willst Du so eine genaue Fehlerbeschreibung erhalten?
    Jemand schlecht gelaunt? Das geht auch, ohne in jedem Satz mindestens einmal "Scheiße" zu sagen.
    My.Computer ist nicht tödlich, allerdings würde ich die System.IO-Klassen bevorzugen.
    MsgBox oder MessageBox.Show ist mehr oder weniger eine Stilfrage, wobei letzteres generell doch bevorzugt werden sollte, da es aus dem .NET-Framework stammt und kein Relikt aus VB6 ist.
    Ansonsten hat er recht: Try-Catch raus und sehen, was für Fehler auftauchen. Try-Catch-Blöcke sollten nur verwendet werden, wenn es wirklich unüberprüfbar ist, ob ein Fehler auftreten wird oder nicht.
    Beim Lesen einer Datei kannst du z.B. zuerst mit File.Exists überprüfen, ob die Datei existiert, bevor du sie öffnest.

    joscha999 schrieb:

    möglichkeit 1. die datei würd falsch beschrieben und das spiel kann diese nicht mehr lesen / schau dir mal an ob das was rauskomt gut aussieht
    ähm mehr felt mir grade ned ein :/ versuch das erstma
    Der Output sieht gut aus, der Wert wird scheinbar korrekt übernommen (Kann man hier keine Bilder direkt hochlanden? :cursing: )


    haiyyu schrieb:

    Jemand schlecht gelaunt? Das geht auch, ohne in jedem Satz mindestens einmal "Scheiße" zu sagen.
    My.Computer ist nicht tödlich, allerdings würde ich die System.IO-Klassen bevorzugen.
    MsgBox oder MessageBox.Show ist mehr oder weniger eine Stilfrage, wobei letzteres generell doch bevorzugt werden sollte, da es aus dem .NET-Framework stammt und kein Relikt aus VB6 ist.
    Ansonsten hat er recht: Try-Catch raus und sehen, was für Fehler auftauchen. Try-Catch-Blöcke sollten nur verwendet werden, wenn es wirklich unüberprüfbar ist, ob ein Fehler auftreten wird oder nicht.
    Beim Lesen einer Datei kannst du z.B. zuerst mit File.Exists überprüfen, ob die Datei existiert, bevor du sie öffnest.
    Danke, bin immer für konstruktive Kritik offen, beginne im Sommer meine Lehre :)
    Ich werde das Zeug nach und nach verbessern, konzentriere mich gerade nur auf die Lösung dieses Problems.

    Fehlermeldung tritt keine auf, die Datei wird ja eigentlich richtig geschrieben.
    :)

    Das erste Bild zeigt den Originaltext, das zweite den vom Programm veränderten.

    /edit
    Könnte es an verschiedenen Codierungen liegen? Sollte ich trotzdem eine Dateiendung wie .txt oder .dat (?) verwenden?
    Bilder
    • Dwm 2012-02-23 20-35-05-78.jpg

      30,01 kB, 291×137, 77 mal angesehen
    • Dwm 2012-02-23 20-35-33-08.jpg

      30,54 kB, 389×137, 78 mal angesehen

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

    ja, und einfach mal mit Notepad nachgugge, was denn vorher das Encoding war?

    bei deiner aufzählung fehlt mir nämlich Encoding.Default (=Ansi)

    NotePad2 kennichnich, aber bei Notepad kann man auf "Speichern unter..." gehen, und dann auch das Encoding auswählen, wobei die Voreinstellung dann das ursprüngliche Encoding anzeigt.
    Das scheint bei NotePad2 so nicht zu fuktionieren, wenn ich über "File -> Encoding" bekomm ich auch "ANSI".
    Ich versuch mal auf dass umzustellen.

    /edit
    Joa, hat geplappt, ich las es jetz so, danke.
    Die Liste hatte ich vom MSDN, hatte vorher keine Ahnung von Encodings :)