Mit PHP, wie Sie Text einfügen, ohne auf den Anfang einer Textdatei zu überschreiben
Frage
ich habe:
<?php
$file=fopen(date("Y-m-d").".txt","r+") or exit("Unable to open file!");
if ($_POST["lastname"] <> "")
{
fwrite($file,$_POST["lastname"]."\n");
}
fclose($file);
?>
, aber es überschreibt den Anfang der Datei. Wie kann ich es einsetzen machen?
Lösung
Ich bin mir nicht ganz sicher, Ihrer Frage - tun Sie Daten schreiben möchten und es nicht den Anfang einer vorhandenen Datei überschreiben, oder schreiben neue Daten auf den Beginn einer bestehenden Datei, halten die vorhandenen Inhalte nach es?
Um den Text einzufügen, ohne Über Schreiben der Anfang der Datei , werden Sie es zum Anhängen ( a+
statt r+
)
$file=fopen(date("Y-m-d").".txt","a+") or exit("Unable to open file!");
if ($_POST["lastname"] <> "")
{
fwrite($file,$_POST["lastname"]."\n");
}
fclose($file);
Wenn Sie versuchen, auf den Anfang der Datei zu schreiben, werden Sie in dem Dateiinhalt lesen (siehe file_get_contents
) zuerst, dann schreiben Sie Ihre neue Zeichenfolge von Dateiinhalt in die Ausgabedatei gefolgt.
$old_content = file_get_contents($file);
fwrite($file, $new_content."\n".$old_content);
Der obige Ansatz wird mit kleinen Dateien arbeiten, aber Sie können in den Speicher Grenzen laufen versuchen, sich mit der file_get_conents
eine große Datei zu lesen. In diesem Fall sollten Sie mit rewind($file)
, die den Dateipositionsindikator für Griff des Datei-Stream an den Anfang setzt .
Beachten Sie, wenn rewind()
verwendet, nicht die Datei mit dem a
zu öffnen (oder a+
) Optionen, wie:
Wenn Sie die Datei im Anfügen geöffnet haben ( „a“ oder „a +“) Modus, alle Daten, die in die Datei schreiben wird immer angehängt werden, unabhängig von der Dateiposition.
Andere Tipps
Ein Arbeitsbeispiel für ohne Überschreiben in der Mitte eines Dateistrom eingeführt wird, und ohne dass das Ganze in eine Variable / Speicher laden:
function finsert($handle, $string, $bufferSize = 16384) {
$insertionPoint = ftell($handle);
// Create a temp file to stream into
$tempPath = tempnam(sys_get_temp_dir(), "file-chainer");
$lastPartHandle = fopen($tempPath, "w+");
// Read in everything from the insertion point and forward
while (!feof($handle)) {
fwrite($lastPartHandle, fread($handle, $bufferSize), $bufferSize);
}
// Rewind to the insertion point
fseek($handle, $insertionPoint);
// Rewind the temporary stream
rewind($lastPartHandle);
// Write back everything starting with the string to insert
fwrite($handle, $string);
while (!feof($lastPartHandle)) {
fwrite($handle, fread($lastPartHandle, $bufferSize), $bufferSize);
}
// Close the last part handle and delete it
fclose($lastPartHandle);
unlink($tempPath);
// Re-set pointer
fseek($handle, $insertionPoint + strlen($string));
}
$handle = fopen("file.txt", "w+");
fwrite($handle, "foobar");
rewind($handle);
finsert($handle, "baz");
// File stream is now: bazfoobar
Komponist lib es hier werden kann
Sie erhalten die gleiche Datei zum Anhängen
Öffnen<?php
$file=fopen(date("Y-m-d").".txt","a+") or exit("Unable to open file!");
if ($_POST["lastname"] <> "")
{
fwrite($file,$_POST["lastname"]."\n");
}
fclose($file);
?>
Wenn Sie Ihren Text am Anfang der Datei setzen möchten, würden Sie den Inhalt der Datei lesen muss zuerst wie:
<?php
$file=fopen(date("Y-m-d").".txt","r+") or exit("Unable to open file!");
if ($_POST["lastname"] <> "")
{
$existingText = file_get_contents($file);
fwrite($file, $existingText . $_POST["lastname"]."\n");
}
fclose($file);
?>