Ich möchte eine Textdatei in den Ressourcen überschreiben bzw. eine Zeile neu schreiben oder verändern lassen.

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von X-Zat.

    Ich möchte eine Textdatei in den Ressourcen überschreiben bzw. eine Zeile neu schreiben oder verändern lassen.

    Imports System.IO
    Imports System.ArgumentException
    Module ChangeSettings
    Sub Main()
    Dim lines() As String = System.IO.File.ReadAllLines(My.Resources.Install3rdperson)
    If lines.Count >= 76 Then
    lines(76) = ".Bindings=(Name=""" + SettingsForm.Freecam.Text + """" + "," + "Command=" + "Camera Freecam" + ")"
    System.IO.File.WriteAllLines(My.Resources.Install3rdperson, lines)
    End If
    End Sub
    End Module
    Bilder
    • Unbenannt.png

      22,35 kB, 1.204×636, 152 mal angesehen
    Schau dir die Funktion ​File.ReadAllLines() mal genauer an.

    Diese verlangt als Übergabe-Parameter einen String - genauer: den Pfad zur Datei. Deine Ressource hingegen beinhaltet bereits die Datei.

    Entweder versucht du:
    - über eine Funktion/Eigenschaft von Install3rdPerson den Pfad zu bekommen
    - lagerst es aus den Ressourcen aus
    - Holst dir den Pfad der Ressourcen extra und hängst den Datei-Namen incl. Endung mit an

    LG Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    Mich wundert es auch, dass eine Ressource kein Pfad-Property hat, aber naja...

    Du hast die Möglichkeit, den Pfad über ​Assembly.GetExecutingAssembly().GetManifestResourceStream("RootNamespace.Resources.Files.File.txt") (Quelle) herauszufinden und damit dann dein ReadAllLines zu bestücken.

    Vielleicht etwas schöner: Das ganze über Streams zu machen. (Quelle)


    LG Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    @Acr0most Hast du die Frage richtig verstanden? Timm3D möchte die Ressource nicht nur lesen, sondern auch schreiben.

    Meines Wissens nach ist es nicht möglich die eigene Exe zur Laufzeit zu verändern. Du müsstest eine Kopie erstellen und dann diese verändern.
    @Bluespide Danke dir :S - War von meinem eigenen Post oben verwirrt :D

    Wenn du die verändern möchte, musst du die Ressource aus den eigentlichen eingebundenen Ressourcen herausnehmen und bspw. neben der .exe abspeichern.
    Dadurch hast du beim einlesen folgende Syntax:

    Quellcode

    1. System.IO.File.ReadAllLines(Application.StartupPath & "\deinFile.txt")


    damit kannst du auch ganz einfach den Text überschreiben oder etwas anhängen.

    LG Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:

    Timm3D schrieb:

    Aber gibt es keinen Weg die Resourcen zu verändern bzw. die txt Datei zu verändern während die exe läuft?
    Nein.
    Ressourcen sind readonly, die werden zur Compilezeit geschrieben.
    Wenn Du dynamisch da was machen willst, kannst Du ja die Differenz in die Settings schreiben, wenn das lohnt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    [...]
    Nein.
    Ressourcen sind readonly, die werden zur Compilezeit geschrieben.
    Wenn Du dynamisch da was machen willst, kannst Du ja die Differenz in die Settings schreiben, wenn das lohnt.


    Exakt: Die Ressourcen der eigenen Assembly zur Laufzeit zu editieren ist so nicht vorgesehen, aber durchaus möglich!
    • Schreibe eine Dummy-Anwendung, deren einziger Zweck es ist, deine eigentliche Assembly aus dem RAM zu laden (-> Assembly.Load)
    • Bestimme, welche Inhalt du ändern möchtest
    • Lade die originale Assembly von der HDD in den RAM
    • Finde die Ressource mithilfe eines Pattern-Scanners (-> öffne einen Stream zum Lesen der Datei)
    • Finde die Rohdaten: Schreibe deine Änderungen in die Exe an die gefundene Stelle (-> Schreibe die gesamte geänderte Datei in einen Ausgabe-Stream)
    • Fertig.
    Es ist nicht schön, aber es funktioniert. Vorausgesetzt, deine ursprüngliche Ressource hat genug Platz reserviert, um künftigen Änderungen ausreichend Platz zu bieten.
    Es ist wirklich nicht schön.
    Ich würde es vermutlich nicht so machen. Außer ich würde aus irgendeinem Grund so wenig Dateien auf dem System "droppen" wie möglich. Aber das ist ein anderes Thema...