Tom: Dateizeiger mit rewind() positionieren

Beitrag lesen

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