Используя php, как вставить текст без перезаписи в начало текстового файла
Вопрос
У меня есть:
<?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);
?>
но это перезаписывает начало файла.Как мне заставить его вставить?
Решение
Я не совсем уверен в вашем вопросе - вы хотите записать данные и не перезаписывать их в начале существующего файла или записать новые данные в начало существующего файла, сохранив существующее содержимое после него?
Для вставки текста без перезаписи начала файла, вам придется открыть его для добавления (a+
вместо того , чтобы 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);
Если вы пытаетесь выполнить запись в начало файла, вам нужно будет ознакомиться с содержимым файла (см. file_get_contents
) сначала запишите новую строку, за которой следует содержимое файла, в выходной файл.
$old_content = file_get_contents($file);
fwrite($file, $new_content."\n".$old_content);
Описанный выше подход будет работать с небольшими файлами, но вы можете столкнуться с ограничениями памяти, пытаясь прочитать большой файл при использовании file_get_conents
.В этом случае рассмотрите возможность использования rewind($file)
, который устанавливает индикатор положения файла для дескриптора в начало файлового потока.Обратите внимание при использовании rewind()
, не открывать файл с a
(или a+
) варианты, как:
Если вы открыли файл в режиме добавления ("a" или "a +"), любые данные, которые вы записываете в файл, всегда будут добавлены, независимо от положения файла.
Другие советы
Рабочий пример для вставки в середину файлового потока без перезаписи и без необходимости загружать все это в переменную / память:
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
Вы получаете то же самое, открывая файл для добавления
<?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);
?>
Если вы хотите поместить свой текст в начало файла, вам придется сначала прочитать содержимое файла следующим образом:
<?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);
?>