Dateizeiger mit rewind() positionieren
Kerstin
- php
0 Philipp Hasenfratz0 Kerstin0 Halandriel0 Tom0 Tom
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
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
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.
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?
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
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