Camping_RIDER: String in eine bestehende TXT-Datei einfügen

Beitrag lesen

Aloha ;)

ich hab eine Lösung gefunden.

Ich werde zuerst, wie du es sagtest, eine temporäre Datei erstellen, wo ich den neuen Inhalt reinschreibe. Als nächsten Schritt, lese ich mittels ReadAll() (Scripting.Filesystemobject - IE-only), die "alte" TXT-Datei ein und füge dieses mittels File.write() einfach hinter dem Inhalt der temporären Datei an.

Gut, dass du eine Lösung gefunden hast...

...allerdings unterscheidet die sich in keinster Weise von dem, was du laut ursrpünglicher Fragestellung nicht wolltest. Ob du jetzt alles ins Programm einliest, im Programm die Zeile vorne anfügst, und dann alles wieder schreibst (was du ursprünglich nicht wolltest), oder (wie du es jetzt machst) die Zeile vorne schreibst, dann alles liest, und wieder alles schreibst - macht (as good as) gar keinen Unterschied, es gibt keinen Performancevorteil, den ich erkennen kann (da du beides mal genau gleich viel a) in den Hauptspeicher liest und b) schreibst).

Der Performancevorteil entsteht dann, wenn du den Hauptteil der Datei unbesehen in der Datei belassen kannst und nur das neue jeweils tatsächlich schreibst (wie du ja, laut deiner ursprünglichen Frage, auch erkannt hattest). Denn dann hast du statt 14001 Zeilen in den Programmspeicher zu laden und nachher zu schreiben nur eine Zeile in den Programmspeicher geladen und nachher geschrieben.

Und das ist tatsächlich (mit gewöhnlichen Mitteln auf normalen Dateisystemen) nur möglich, wenn du deine neuen Daten hinten anfügst. Das liegt unter anderem daran, wie Dateien in Dateisystemen gespeichert werden.

Beispiel aus ext2: Hier werden die Daten der Datei in Blöcken auf der Festplatte gespeichert, deren Adressen nacheinander im inode vermerkt werden. Möchtest du Daten hinten dazuschreiben, so kann im letzten vermerkten Block weitergeschrieben werden, bis dieser voll ist, und dann wird ein neuer angelegt. Es muss also im Dateisystem nur das verändert werden, was sich im Endergebnis (der fertig geschriebenen Datei) auch verändert. Willst du Daten vorne anfügen, so muss im günstigen Fall (wenn du genau so viel Daten schreibst, wie auch in eine ganze Zahl von Blöcken passt) jeder Vermerk verschoben werden und im schlimmsten Fall (wenn die einzufügenden Blöcke mit dem einzufügenden Inhalt nicht genau voll werden) auch noch der gesamte Dateiinhalt verschoben werden, über Speicherblockgrenzen hinweg - was gleichwertig dazu bzw. noch komplizierter ist, als die komplette Datei einfach neu zu speichern. Betrachtet man den Aufwand der beiden Operationen im Vergleich dürfte ziemlich klar sein, warum Dateisysteme und Programmiersprachen nur erstere Operation zur Verfügung stellen und zweitere gar nicht anbieten.

Wenn du performant bleiben willst musst du also deine Datenstruktur an die Gegebenheiten anpassen. (Vorausgesetzt, die Engine des IE macht nicht aus dem was du programmierst später wieder Murks, indem sie grundsätzlich Dateien bei Änderungen komplett neu schreibt - man weiß ja nie so recht bei dem Verein.)

Grüße,

RIDER

--
Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller Erreichbar manchmal im Self-TS (ts.selfhtml.org) oder sonst - wenn online - auf dem eigenen TeamSpeak-Server (fritz.campingrider.de) oder unter: # Facebook # Twitter # Steam # YouTube # Self-Wiki # ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[