Der Befehl truncate, der laut Dokumentation nicht auf allen Systemen vorhanden ist (bei mir jedoch unter Windows XP, Vista und Linux schon), kann dazu verwendet werden, eine Dateigröße nachträglich zu ändern.
Beispiel:
open (my $out,'>','test.txt'); print $out "123456789";
truncate($out,4); close $out;
Wenn man diese Datei jetzt öffnet, so findet man die Zeichen 1234 darin, der Rest wurde abgeschnitten.
Natürlich geht das auch in die andere Richtung, also eine "Vergrößerung" einer Datei.
Würde man also im obigen Beispiel truncate ($out,100); schreiben, so würde die Datei mit \0-Zeichen aufgefüllt, bis die Dateilänge 100 ist.
Yo, schon schön das... aber wozu das nun? Ich könnte doch auch eine Datei einfach gleich so schreiben, dass sie so ist, wie sie sein soll... oder nicht?
Natürlich hat das ganze schon so seinen Grund, sonst würde ich hier ja nicht drüber schreiben: Angenommenerweise, ich habe da so eine Textdatei, aus der ich einige Zeilen entfernen will. Plan A wäre also, die Datei einzulesen, die Zeilen zu löschen, und dann die Datei neu zu schreiben. Funktioniert ja auch, allerdings gehts schneller, wenn man die Datei nicht neu zum Schreiben öffnet, sonder gleich in die vorhandene Datei schreibt und dann die Dateilänge anpasst.
Also ein kurzes Beispiel:
# Langsamere Variante open (my $datei,'<','test.txt');
@allezeilen=<$datei>; close $datei;
Zu beachten ist, daß vor dem Schreiben die Datei in den Binärmodus geschaltet werden muß, sonst haut das Ganze nicht hin.
Weiterhin zu beachten ist, daß ein truncate ($datei,0) nicht reicht, um den Dateizeiger auf 0 zu setzen, das seek(0,0) ist schon nötig, sonst gibt es Datensalat!
Nach meinen Messungen ist die schnellere Variante bis zu 20 % schneller, als eine Datei zu öffnen und dann neu zu schreiben. Und auch die Festplatte wird es wohl freuen, da pro Durchlauf je ein Datei-Löschen und -Neuanlegen weniger stattfindet.