Kerstin: Dateizeiger mit rewind() positionieren

Hallo,
ich habe ein Problem beim schreiben in eine Datei.
Ich möchte an den Anang der Datei einen Text einfügen. Dazu habe ich folgendes programmiert:
-----------------------------------------------------
$fp = fopen('test.htm', "a");
rewind($fp));
echo(ftell($fp));     # Ausgabe ist tatsächlich "0"
fputs($fp, $text);
fclose($fp);
-----------------------------------------------------
Dieses Programm schreibt den $text allerdings immer an das Ende der Datei.
Das verstehe ich nicht!
Kann mir jemand helfen?
ciaoi
Kerstin

  1. Halihallo Kerstin

    Dieses Programm schreibt den $text allerdings immer an das Ende der Datei.
    Das verstehe ich nicht!

    <www.php.net/rewind> *ganz* lesen (auch die Anmerkungen) und
    verstehen. Dann fällt die Wahl des mode schnell auf 'w' und nicht auf
    'a'...

    Viele Grüsse

    Philipp

    1. Hallo Philip,
      danke für deinen , das wußte ich nicht. ABER:

      Dann fällt die Wahl des mode schnell auf 'w' und nicht auf
      'a'...

      Wenn ich "w" benutze wird die Datei aber überschrieben (auf 0 byte gesetzt).
      Alle anderen Inhalte gehen somit verloren.

      Gibt es keine andere Möglichkeit? (außer vorher die ganze Datei auszulesen z.B. mit file(), den Text davor zu hängen, und dann alles nbeu zu schreiben)

      Kerstin.

      1. Gibt es keine andere Möglichkeit? (außer vorher die ganze Datei auszulesen z.B. mit file(), den Text davor zu hängen, und dann alles nbeu zu schreiben)

        Nein, so wird das üblicherweise gemacht. Alles hinter der Einfügeposition einlesen, neuen Inhalt an diese Position schreiben und das Eingelesene wieder anhängen.

        Aber warum willst du unbedingt an den Dateianfang schreiben?

      2. Hello Kerstin,

        Wenn ich "w" benutze wird die Datei aber überschrieben (auf 0 byte gesetzt).
        Alle anderen Inhalte gehen somit verloren.

        Gibt es keine andere Möglichkeit? (außer vorher die ganze Datei auszulesen z.B. mit file(), den Text davor zu hängen, und dann alles nbeu zu schreiben)

        Wahrscheinlich musst Du sowieso die Datei sperren, um sie dann auszulesen und zu verändern.
        Ich habe meinen Artikel zum Record-Locking leider immer noch nicht fertig, aber man könnte das so machen:

        $dateiname = 'bla';
        $fehler = '';

        function openlock($dateiname,&$fehler)
        {
          $fh = @fopen($dateiname,'a+');       # Datei anlegen, falls sie nicht da ist,
          if (!$fh)                            # sowie Lese- und Schreibberechtigung prüfen
          {
            $fehler = $php_errormsg;           # hierzu muss track_errors eingeschaltet sein!
            return false;
          }
          fclose($fh);

        $fh = @fopen($dateiname,'r+b');      # Datei zum Lesen und Schreiben öffnen
          if (!$fh)
          {
            $fehler = $php_errormsg;           # hierzu muss track_errors eingeschaltet sein!
            return false;
          }

        if (!flock($fh,LOCK_EX + LOCK_NB))   # Versuchen, die Datei zu sperren, aber nicht auf
          {                                    # die Sperre warten.
            $fehler = "Datei konnte nicht gesperrt werden";
            fclose ($fh);                      # Schließen
            return false;
          }

        return $fh;
        }

        Wenn Du die Datei mittels dieser Funktion (die in meinem Artikel noch wesentlich komplexer ist) öffnest, dann solltest Du nicht auf einen "Hammer" laufen.

        Du darfst jetzt mittels fseek() den dateizeige in der Datei bewegen und kannst beliebig Lesen und schreiben. Die exklusive Sperre ist immer dann notwendig, wenn man Dateiinhalte zum Zwecke der sofoertigen Veränderung (also innerhalb eines Scriptes) lesen will. das wird häufig verkehrt verstanden. Ein shared Lock reicht da nicht!

        Wenn Du die Datei später wieder schließt, dann wird das Lock automatisch entfernt.

        Es handelt sich aber nur um ein advisory Lock. Daher müssen alle Scripte, die mit denselben Dateien arbeiten diese Prüfung durchführen.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hello,

          [...]

          Die exklusive Sperre ist immer dann notwendig, wenn man Dateiinhalte zum Zwecke der sofoertigen Veränderung (also innerhalb eines Scriptes) lesen

          und verändert zurückschreiben will.

          Der Sinn war irgendwie verloren gegangen.

          Bin gerade dabei, neben dem Job die Locking-Strategien für MySQL zu beschreiben. Ist auch nicht ganz ohne, obwohl das DBMS schon viel alleine macht.

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau