Используя php, как вставить текст без перезаписи в начало текстового файла - PullRequest
6 голосов
/ 19 сентября 2008

у меня есть:

<?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);

?>

но оно перезаписывает начало файла. Как мне сделать это вставить?

Ответы [ 4 ]

25 голосов
/ 19 сентября 2008

Я не совсем уверен в вашем вопросе: хотите ли вы записать данные, а не перезаписать начало существующего файла или записать новые данные в начало существующего файла, сохранив существующий контент после это?

Чтобы вставить текст без перезаписи начала файла , вам нужно открыть его для добавления (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 +»), любые данные, которые вы записываете в файл, всегда будут добавляться независимо от позиции файла.

1 голос
/ 29 сентября 2014

Рабочий пример для вставки в середину файлового потока без перезаписи и без необходимости загрузки всего объекта в переменную / память:

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

Композитор lib для него можно найти здесь

0 голосов
/ 19 сентября 2008

Вы получаете то же самое, открывая файл для добавления

<?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);
?>
0 голосов
/ 19 сентября 2008

Если вы хотите поместить свой текст в начало файла, вам сначала нужно прочитать содержимое файла, например:

<?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);

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...