Textdatei im Hintergrund bearbeiten Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Textdatei im Hintergrund bearbeiten

Post by Stroker-007 » 04 Feb 2023, 01:47

Hallo zusammen!

Im Rahmen eines Hauptskripts zur Steuerung eines Render-Vorgangs wird dabei auch ein Logfile.txt gepflegt, das mittels FileAppend absatzweise aktualisiert wird.
Sieht dann so aus:
C:\Test-1.mp4
04.02.23 _start_ 05:48:49
04.02.23 _stop__ 05:49:07
========================= 58

C:\Test-2.mp4
04.02.23 _start_ 05:50:58
04.02.23 _stop__ 05:51:15
========================= 57

C:\Test-3.mp4
04.02.23 _start_ 05:52:36
04.02.23 _stop__ 05:55:01
========================= 265

[usw]
FileAppend fügt neue Einträge ja immer ans Ende an, schreibt also von oben nach unten. Ich aber hätte die neuen Einträge gerne am Anfang, so daß die Logdatei chronologisch von unten nach oben gepflegt wird.

Frage 1: Kann das womöglich FileAppend selbst, nur weiß ich nicht, wie es geht?

Zur Lösung des Falls dient mir zunächst dieses putzige Skript:

Code: Select all

SendMode input
run notepad.exe c:\Logfile.txt
Winwait Logfile
send ^{end}
send +{up 5}
send +{del}
send ^{home}
send ^v
send ^s
send !{f4}

...das im Rahmen des Hauptkripts abläuft und die Angelegenheit richtet, nachdem FileAppend seine Einträge vorgenommen hat.

Unschön dabei ist, daß es nicht wie bei FileAppend im Hintergrund geschehen kann, sondern zum korrekten Arbeiten im Vordergrund sein muß. Das geht zwar blitzschnell, letztlich ist nur ein kurzer Zuck wahrnehmbar, aber unschön ist es trotzdem.

Hoffnungen habe ich dann in FileOpen() gesetzt, komme aber nicht zurecht damit, vermutlich weil ich - trotz Hilfe rauf- und runterlesen - nicht wirklich verstehe, wie das funktioniert.

Kann mir bitte jemand weiterhelfen?
Wie bearbeitet man eine Textdatei in dieser hintergründigen Weise, so wie das FileAppend macht?
Oder geht das nicht, und ich habe bereits das möglichste gemacht?

Grüße!

just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Textdatei im Hintergrund bearbeiten  Topic is solved

Post by just me » 04 Feb 2023, 04:05

Moin,

FileAppend allein kann das nicht. Die 'klassische' Methode wäre:

Code: Select all

FileRead, AlterInhalt, ...                      ; Datei einlesen
FileDelete, ...                                 ; Datei löschen
NeuerInhalt := "...`n"                          ; neuen inhalt erstellen
FileAppend, %NeuerInhalt%%AlterInhalt%, ...     ; Datei komplett neu schreiben
Etwas 'eleganter' geht das mit dem File-Objekt:

Code: Select all

FileObj := FileOpen("Datei", "rw")        ; Datei zum Lesen und Schreiben öffnen
FilePos := FileObj.Pos                    ; aktuelle Position merken, falls die Datei ein BOM hat (UTF-8 oder UTF-16).
AlterInhalt := FileObj.Read()             ; alten Inhalt einlesen
FileObj.Pos := FilePos                    ; aktuelle Position zurücksetzen
NeuerInhalt := "...`n"                    ; neuen Inhalt erstellen
FileObj.Write(NeuerInhalt . AlterInhalt)  ; Datei neu schreiben
FileObj.Close()                           ; Datei schließen
Die Datei muss dabei nur einmal geöffnet und geschlossen werden.

Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Re: Textdatei im Hintergrund bearbeiten

Post by Stroker-007 » 05 Feb 2023, 01:44

Hallo just me!

Danke für diese Idee, die hat´s gerichtet. Wobei ja beide Varianten denselben Ansatz verfolgen.
Die zweite Variante als File-Object laß ich jetzt mal beiseite für spätere Zeiten, wenn ich viel klüger sein werde ;-)

Allerdings waren noch leichte Modifikationen nötig, weil diese 4 Zeilen pro Vorgang (Dateiname, Startzeit, Stoppzeit, Dauer) ja nicht adhoc nacheinander erfaßt werden können. Dazwischen findet immer der mehr oder weniger lange Rendervorgang statt. Und der kann aus diversen Gründen auch mal schiefgehen oder unterbrochen werden, vor allem von mir selbst, wenn ich´s mir anders überlege oder noch was vergessen habe. Zzgl. händischem Abwürgen des dann immer noch offenen Skripts. Das zwischenzeitliche Auslagern oder Erfassen von Inhalten in eine Variable, speziell der kompletten alten Logfile, aber auch der neuen Daten, kann im Cancel-Fall somit brandgefährlich sein, wenn sich dann die (bisherige) und bereits gelöschte Logfile vom Clipboard (oder einer Variable) aufgrund von "vorzeitig geschlossen" ins Nirwana verabschiedet. Also sollten alle Inhalte möglichst durchgehend auf Festspeicher gehalten werden.

Dieser kleine Umbau dürfte dann solche Verluste verhindern:

Code: Select all

; ...
; Mit FileAppend die 4 neuen Einträge successive in eine extra Sammel-Datei schreiben: c:\Collector.txt 
; ...
sleep 300
FileRead, AlterInhalt, c:\Logfile.txt
sleep 300
FileAppend, %AlterInhalt%, c:\Collector.txt
sleep 300
FileMove, c:\Collector.txt, c:\Logfile.txt, 1

Funktioniert wie es soll, die sleep´s erhöhen die Zuverläßigkeit und sind zeitlich unwichtig, da das Ganze eh nur für die Katz, also für den Hintergrund ist. Logfile eben.

Grüße

Post Reply

Return to “Ich brauche Hilfe”