Erik Wagner: Problem mit Dateilänge (Optimierungsfrage...)

Hallo Leute!

Ein kleines Problem: In einem Perl-Script lese ich aus Datei A Daten aus, modifiziere diese und schreibe sie in Datei B. Die geänderten Daten aus Datei B müssen aber wieder in Datei A zurück.
Das Problem dabei ist, daß Datei A dabei die ganze Zeit geöffnet bleibt (im lese/schreib-Zugriff) und wenn ich die Daten aus Datei B in Datei A zurückschreibe (vorher bin ich natürlich mit seek an den Datei-Anfang zurückgesprungen) und die geänderten Daten ingesammt kürzer als die Originaldaten geworden sind, habe ich ja einen Rest der alten Daten aus Datei A noch am Ende in Datei A stehen. Um diese wegzubekommen benutze ich die Funktion "truncate" die als Wert die Länger von Datei B erhält. Die Länge von Datei B habe ich bisher mit der Funktion "stat" herrausbekommen. Allerdings erscheint mir das etwas umständlich, Datei B immer erst schließen zu müssen, dann die Funktion "stat" aufrufen und dann Datei B wieder öffnen.

Meine Frage nun: gibt es eine Variable oder eine Funktion von der ich einen Wert bekomme, der mier sagt, wieviele Bytes ich am Stück in eine Datei (in diesem Fall Datei B) geschrieben habe!? Dann könnte ich nämlich Datei B auch im lese/schreib-Modus öffnen und könnte mir die Funktion "stat" sparen und spare mir ein unnötiges schließen und öffnen von Datei B...

Vielen Dank schonmal im Vorraus
Ciao, Servus, JHMF

  1. Hallo,

    Ich verstehe nicht, warum Du es so kompliziert machst.
    Ich würde entweder Datei A komplett in den Speicher lesen, und dann den Speciherinhalt wieder zruück in die Datei schreiben. Das geht natürlich nur , wenn Die Datei nicht wirklich groß ist.
    Oder Du öffnest die erste lesend, die zwiete schreibend, überträgst die Daten also von A nach B. Und wenn Du fertig bist, löscht Du a und benennst b auf a um.

    In beiden Fällen ersparst Du Dir den zweiten lese/schreib-Vorgang.

    fürs löschen siehe bitte
    perldoc -f unlink

    fürs umbenennen
    perldoc -f rename

    Meine Frage nun: gibt es eine Variable oder eine Funktion von der ich einen Wert bekomme, der mier sagt, wieviele Bytes ich am Stück in eine Datei (in diesem Fall Datei B) geschrieben habe!?

    Die Funktion heißt stat. oder Du verwendest -s:
    $filesize = -s HANDLE_TO_FILE_B;

    Du kannst auch nach dem schreiben aller Daten nach B mit tell() die aktuelle Position im File abfragen.

    Aber, wie gesagt, ich würde es nicht so kompliziert machen.

    Grüße
      Klaus

    1. Danke für die Infos! besonders die tell()-Funktion bringt mich weiter! Die von dir vorgeschlagene Variante kann ich auf gar keinen Fall benutzen, weil es sich bei Datei A um eine CSV-Datei handelt, welche laufend Anmeldungen neu aufnimmt (bzw. hoffentlich aufnehmen wird *g*), daß heißt ich muss sie zusätzlich dazu, daß ich sie während die Daten gelesn, verändert und neugeschrieben werden, flocken muss, da kann ich die Datei auf keinen Fall einfach löschen!

      Trotzdem Danke für die Hilfen, das müsste mir weiterhelfen.
      Ciao, Erik

      1. Hallo Erik,

        Die von dir vorgeschlagene Variante kann ich auf gar keinen Fall benutzen, weil ... flocken muss, da kann ich die Datei auf keinen Fall einfach löschen!

        Aber Du kannst sehr wohl eine weitere (0-byte-)Datei zur Synchronisation flock()en und *dann* Deine eigentliche Datei sehr wohl löschen und neu schreiben.

        mfG - Michael