Нужно написать в начале файла с PHP - PullRequest
33 голосов
/ 19 ноября 2009

Я делаю эту программу и пытаюсь выяснить, как записывать данные в начало файла, а не в конец. «a» / append пишет только до конца, как я могу сделать так, чтобы он записывал в начало? Потому что "r +" делает это, но перезаписывает предыдущие данные.

$datab = fopen('database.txt', "r+");

Вот весь мой файл:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>Facebook v0.1</title>
        <style type="text/css">
            #bod{
                margin:0 auto;
                width:800px;
                border:solid 2px black;
            }
        </style>
    </head>

    <body>
        <div id="bod">
            <?php
                $fname = $_REQUEST['fname'];
                $lname = $_REQUEST['lname'];
                $comment = $_REQUEST['comment'];
                $datab = $_REQUEST['datab'];
                $gfile = $_REQUEST['gfile'];

                print <<<form
                <table border="2" style="margin:0 auto;">
                    <td>
                        <form method="post"  action="">
                              First Name :
                              <input type ="text"
                                         name="fname"
                                         value="">
                              <br>

                              Last Name :
                                <input type ="text"
                                         name="lname"
                                         value="">
                              <br>

                              Comment :
                              <input type ="text"
                                         name="comment"
                                         value="">
                              <br>
                              <input type ="submit" value="Submit">
                        </form>
                    </td>
                </table>
                form;
                if((!empty($fname)) && (!empty($lname)) && (!empty($comment))){
                    $form = <<<come

                    <table border='2' width='300px' style="margin:0 auto;">
                        <tr>
                            <td>
                                <span style="color:blue; font-weight:bold;">
                                $fname $lname :
                                </span>

                                $comment
                            </td>
                        </tr>
                    </table>
                    come;

                    $datab = fopen('database.txt', "r+");
                    fputs($datab, $form);
                    fclose($datab);

                }else if((empty($fname)) && (empty($lname)) && (empty($comment))){
                    print" please input data";
                } // end table

                $datab = fopen('database.txt', "r");

                while (!feof($datab)){
                    $gfile = fgets($datab);
                    print "$gfile";
                }// end of while
            ?>
        </div>
    </body>
</html>

Ответы [ 9 ]

52 голосов
/ 19 ноября 2009

Быстро и грязно:

<?php
$file_data = "Stuff you want to add\n";
$file_data .= file_get_contents('database.txt');
file_put_contents('database.txt', $file_data);
?>
38 голосов
/ 19 ноября 2009

Если вы не хотите загружать все содержимое файла в переменную, вы можете использовать PHP Streams :

function prepend($string, $orig_filename) {
  $context = stream_context_create();
  $orig_file = fopen($orig_filename, 'r', 1, $context);

  $temp_filename = tempnam(sys_get_temp_dir(), 'php_prepend_');
  file_put_contents($temp_filename, $string);
  file_put_contents($temp_filename, $orig_file, FILE_APPEND);

  fclose($orig_file);
  unlink($orig_filename);
  rename($temp_filename, $orig_filename);
}

Это записывает строку, которую вы хотите добавить во временный файл, затем записывает содержимое исходного файла в конец временного файла (используя потоки вместо копирования всего файла в переменную) и, наконец, удаляет исходный файл и переименовывает временный файл для его замены.

Примечание: Этот код был первоначально основан на уже не существующем сообщении в блоге Чао Сюй. С тех пор код разошелся, но исходное сообщение можно просмотреть в Wayback Machine .

4 голосов
/ 14 мая 2017
  1. Открыть файл в режиме w +, а не в режиме +.
  2. Получите длину текста для добавления ($ chunkLength)
  3. при необходимости установить курсор в начало файла
  4. чтение байтов $ chunkLength из файла
  5. вернуть курсор на $ chunkLength * $ i;
  6. написать $ prepend
  7. установить $ prepend значение из шага 4
  8. выполните эти шаги, пока EOF

    $handler = fopen('1.txt', 'w+');//1
    rewind($handler);//3
    $prepend = "I would like to add this text to the beginning of this file";
    $chunkLength = strlen($prepend);//2
    $i = 0;
    do{
        $readData = fread($handler, $chunkLength);//4
        fseek($handler, $i * $chunkLength);//5
        fwrite($handler, $prepend);//6
    
        $prepend = $readData;//7
        $i++;
    }while ($readData);//8
    
    fclose($handler);
    
4 голосов
/ 19 ноября 2009

Я думаю, что вы можете сначала прочитать содержимое файла и сохранить его во временной переменной, а затем вставить новые данные в начало файла, а затем добавить содержимое временной переменной.

$file = file_get_contents($filename);
$content = 'Your Content' . $file;
file_put_contents($content);  
3 голосов
/ 06 июля 2015

Вы можете использовать следующий код для добавления текста в начало и конец файла.

$myFile = "test.csv";<br>
$context = stream_context_create();<br>
  $fp = fopen($myFile, 'r', 1, $context);<br>
  $tmpname = md5("kumar");<br>

//this will append text at the beginning of the file<br><br>
  file_put_contents($tmpname, "kumar");<br>
  file_put_contents($tmpname, $fp, FILE_APPEND);<br>
  fclose($fp);<br>
  unlink($myFile);<br>
  rename($tmpname, $myFile);<br><br>
  //this will append text at the end of the file<br>
  file_put_contents($myFile, "ajay", FILE_APPEND);
1 голос
/ 19 ноября 2009

Этот код запоминает данные с начала файла, чтобы защитить их от перезаписи. Затем он переписывает все данные, существующие в блоке файла, блоком.

$data = "new stuff to insert at the beggining of the file";
$buffer_size = 10000;

$f = fopen("database.txt", "r+");
$old_data_size = strlen($data);
$old_data = fread($f, $old_data_size);
while($old_data_size > 0) {
  fseek($f, SEEK_CUR, -$old_data_size);
  fwrite($f, $data);
  $data = $old_data;
  $old_data = fread($f, $buffer_size);
  $old_data_size = strlen($data);
}
fclose($f);
1 голос
/ 19 ноября 2009

Вы можете использовать fseek для изменения указателя в заметке.

Следует отметить, что если вы используете fwrite, то это сотрет текущий контент. Таким образом, в основном вы должны прочитать весь файл, использовать fseek, написать новый контент, записать старые данные файла.

$file_data = file_get_contents('database.txt')
$fp = fopen('database.txt', 'a');
fseek($fp,0);
fwrite($fp, 'new content');
fwrite($fp, $file_data);
fclose($fp);

Если ваш файл действительно огромен, и вы не хотите использовать слишком много памяти, вы можете использовать двухфайловый подход, такой как

$fp_source = fopen('database.txt', 'r');
$fp_dest = fopen('database_temp.txt', 'w'); // better to generate a real temp filename
fwrite($fp_dest, 'new content');
while (!feof($fp_source)) {
    $contents .= fread($fp_source, 8192);
    fwrite($fp_dest, $contents);
}
fclose($fp_source);
fclose($fp_dest);
unlink('database.txt');
rename('database_temp.txt','database.txt');

По моему честному мнению, решение Бена кажется более простым.

И последнее замечание: я не знаю, что у вас на складе database.txt, но вы можете сделать то же самое проще, используя сервер базы данных.

1 голос
/ 19 ноября 2009

Нет способа записать в начало файла, как вы думаете. Я думаю, это связано с тем, как ОС и жесткий диск видят файл. У него есть фиксированное начало и расширяющийся конец. Если вы хотите добавить что-то посередине или начать, это требует некоторого скольжения. Если это небольшой файл, просто прочитайте все это и сделайте ваши манипуляции и напишите обратно. Но если нет, и если вы всегда добавляете в начало просто обратный порядок строк, рассматривайте конец как начало ...

0 голосов
/ 27 мая 2015

file_get_contents() и file_put_contents() используют больше памяти, чем при использовании функций fopen(), fwrite() и fclose():

$fh = fopen($filename, 'a') or die("can't open file");
fwrite($fh, $fileNewContent);
fclose($fh);
...