У меня есть:
<?php $file=fopen(date("Ymd").".txt","r+") or exit("Unable to open file!"); if ($_POST["lastname"] <> "") { fwrite($file,$_POST["lastname"]."\n"); } fclose($file); ?>
но он перезаписывает начало файла. Как его вставить?
Я не совсем уверен в вашем вопросе – хотите ли вы писать данные и не переписывать начало существующего файла или записывать новые данные в начало существующего файла, сохраняя при этом существующий контент?
Чтобы вставить текст без перезаписи начала файла , вам нужно будет открыть его для добавления ( a+
а не r+
)
$file=fopen(date("Ymd").".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+
), выполните следующие действия:
Если вы открыли файл в режиме append («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
Composer lib для него можно найти здесь
Вы получаете то же самое открытие файла для добавления
<?php $file=fopen(date("Ymd").".txt","a+") or exit("Unable to open file!"); if ($_POST["lastname"] <> "") { fwrite($file,$_POST["lastname"]."\n"); } fclose($file); ?>
Если вы хотите поместить текст в начало файла, вам сначала необходимо прочитать содержимое файла, например:
<?php $file=fopen(date("Ymd").".txt","r+") or exit("Unable to open file!"); if ($_POST["lastname"] <> "") { $existingText = file_get_contents($file); fwrite($file, $existingText . $_POST["lastname"]."\n"); } fclose($file); ?>