Lesen und Schreiben von Txt Files

    Lesen und Schreiben von Txt Files

    Guten Tag liebe Community

    Ich bräuchte einen kleinen Hinweis bezüglich der Umsetzung eines kleines Programms. Die Situation ist die Folgende:
    Eine externe Applikation X erstellt und ergänzt alle etwa 20 Sekunden mehrere Txt Files (immer etwa 20-40 Text Zeilen angehängt). Eine Applikation Y liest diese Text Dateien permanent aus und benutzt es für seine Zwecke.
    Ich brauche jetzt ein Programm, dass die Text Files von Programm X ausliest(falls neue Zeilen hinzugefügt wurden), an gewissen Stellen abändert und sie wieder an einen anderen Ort abspeichert, wo sie Programm Y dann einlesen kann.

    Das habe ich mit FileAssign, TextFile, etc schon gemacht. Jedoch kommen ständig E/A Fehlermeldungen weil die Txt Files ständig von den anderen Programmen benutzt werden.

    Welche andere Lösung würde sich dafür eignen? Könnte ich die Probleme mit TStreamFile umgehen? Oder wäre das zu langsam?

    Danke bereits jetzt

    Grüsse
    Bei einem TFileStream kannst du über den Parameter Mode im Create angeben, wie die Datei geöffnet werden soll :

    Der Parameter Mode legt fest, wie die Datei geöffnet werden
    soll. Mode enthält den Öffnungsmodus und (evtl.) den Freigabemodus.
    Beide Werte werden mit einem logischen ODER verknüpft. Der Öffnungsmodus muss
    einer der folgenden Konstantenwerte sein:

    Weitere Angaben siehe die Hilfe
    Glückauf

    Herr, wirf Hirn vom Himmel

    Ein Leben ohne Möpse ist möglich, aber sinnlos ( Loriot )
    Der beste Platz für Politiker ist das Wahlplakat. Dort ist er tragbar, geräuschlos und leicht zu entfernen ( Loriot )

    Es gibt Leute, die fühlen sich überall gedemütigt, wo sie nicht frech sein dürfen ( Otto Weiss )
    Bei Texdateien (wenn nicht ZU gross) könnte man das Ganze auch recht einfach mit Stringlisten erledigen...

    Das eigentliche Problem dürfte allerdings die Synchronisation sein, also das "Ansprechen" der Dateien so zu timen, dass die nicht gerade von der App X geschrieben werden!

    cckLoud
    @guinnes.. danke dir, werde mich mal in das Thema einlesen. Da ich die txt Files zeilenweise einlese und gewisse Wörter pro Zeile in gewissen Fällen ändern muss, präsentiert sich das AssignFile mit seinen ReadLn and WriteLn als super einfache Lösung, wobeis beim StreamFile einiges komplizierter wird. Und ich bin mir nicht sicher ob ich das eignetliche Problem mit Streamfile umgehen kann, da ich den Mode von den Textdateien des Programms X ja nicht verändern kann.

    @cckLoud Jap, das ist eigentlich das Hauptproblem, die Synchronisation.
    Das kriegst du zuverlässig aber nur über Prog A hin. Da müsstest du ein Semaphor oder so was setzen (beschrieben ist das in Threads, die sich mit "Doppel/Mehrfachstart verhindern" befassen).

    Haste keinen Zugriff auf A, musste halt probieren, ob du Zugriff auf die entsprechende Datei hast. Ist aber bei mehreren Dateien eine ziemliche fiselei...

    cckLoud
    Hmm..

    Wenn das Programm A nicht geändert werden kann, dann würde es z.B. folgende Möglichkeiten geben:

    - ShadowCopy
    Dabei wird eine Kopie der Datei angelegt, auf die du dann lesend zugreifen kannst.

    - Umbenennen
    Wenn Programm X eine nicht mehr vorhandene Datei wieder neu erstellt, dann kann Du versuchen die Datei umzubenennen (eventuell solange versuchen, bis Programm X sie wieder freigegeben hat) und dann kannst Du darauf in Ruhe zugreifen.

    Sowohl die umbenannte, wie auch die Kopie kannst Du dann problemlos öffnen, lesen und bearbeiten und anschließend mit dem original-Namen für Programm Y ablegen
    hey!

    Jap, ich hab jetzt gerade raus gefunden, dass der EA Error 32 auch erscheint wenn Programm A und B gar nicht laufen! Das beruhigt mich ein bisschen, da es wohl heisst, dass es mit meinem Code zu tun hat.

    Habe einen Timer, der alle 2 Sekunden 10 Dateien kopiert und diese auf neue Inhalte überprüft und allenfalls abändert. Könnte es sein, dass es dem irgendwie zu schnell geht und er auf Dateien zugreift, die im vorherigen Durchgang noch offen waren? Ich benutze zwar immer CloseFile am Ende..
    Es geht um anonymisierte Hände einer Online Poker Software. Die Software speichert die gespielten Hände in From einer HandHistory (usually txt file) ab. In den HandHistories kann man den genauen Ablauf der Hand ablesen, welche Spieler involviert sind und was die Action war. Für jeden Tisch, an dem man spielt, kreiert es ein eigenes txt file mit dem Namen des Tisches. Eine Tracking Software (welche eigentlich jeder professionelle Spieler besitzt) liest diese HandHistories ein und fügt sie entsprechend in ihre Datenbank ein. Eine Seite hat jedoch vor kurzem die HandHistories anonymisiert, d.h. die Spielernamen werden durch Player1-Player6 ersetzt und in die HH gespeichert.

    Ich hab jetzt ein Programm geschrieben, welche die HHs ausliest und mit den manuell eingetippten Spielernamen ersetzt und wieder an einem anderen Ort für die Trackingsoftware abspeichert. Die Poker Software schreibt, sobald die Hand fertig gespielt wurde, den Ablauf ins txt file. Mein Programm überprüft mit nem Timer, wieviele Dateien es im Ordner hat, und überprüft ob eine neue Hand gespielt wurde (in dem es die Hand Nr ausliest und mit der letzten Nummer des von mir erstellten Files überprüft). Falls ja, wird die neue Hand in der Zieldatei angehängt.

    Weiss nicht, ob dir das weiterhilft.
    Wenn es um Veränderungen im Dateisystem geht, ist ein Timer zwar möglich, aber nicht effizient. Windows teilt dir mit, wann immer sich etwas tut, du musst den Monitor nur registrieren. Dieser Artikel sollte alles dazu erklären.
    Für die eigentliche Operation ist ein Stream wesentlich effizienter, weil du ja eigentlich nicht an dem alten Inhalt der Zieldatei interessiert bist; du willst nur etwas anhängen. Schattenkopien wie HolgerX vorgeschlagen hat, sind das Mittel der Wahl.
    Du könntest außerdem mal mit Unlocker oder vergleichparen Programmen nachschauen, welche Programme welche Dateien tatsächlich sperren.
    Master of the EDH ;)
    Hey projekter

    Super link, danke dir. Ich glaube ich bin auf einem guten Weg dank euch! Am alten Inhalt der Zieldatei bin ich in gewissen Fällen schon interessiert - ich muss überprüfen, welches das letzte Update in der Zieldatei war und es mit der Originaldatei vergleichen. Ich werde wohl das ganze Programm umschreiben müssen, Timer durch ReadDirectoryChangesW ersetzen und Textfile durch den Stream.

    Danke euch.
    Guten Tag Leute!

    Dank euren Tips habe ich den Code jetzt etwa um die Hälfte reduziert lol. Es geht viel schneller und eleganter und bis jetzt im Grossen und Ganzen ziemlich fehlerfrei. Jedoch erscheint beim Schliessen des Programms ein neues Problem.. diese beiden Fehlermeldungen:

    gyazo.com/d2f94b7e1ba72d8c3eabd8865fe911bb

    gyazo.com/77ba0f16ffcbef605873c3814e555833

    Ich weiss, das hat eignetlich nichts mit dem eignetlichen Topic zu tun, vielleicht weiss doch jemand mit was das zu tun haben könnte.

    Cheers