Нужно писать в начале файла с PHP

Я делаю эту программу, и я пытаюсь выяснить, как записывать данные в начало файла, а не в конец. «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> 

Solutions Collecting From Web of "Нужно писать в начале файла с PHP"

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

 <?php $file_data = "Stuff you want to add\n"; $file_data .= file_get_contents('database.txt'); file_put_contents('database.txt', $file_data); ?> 

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

 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 .

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

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

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

 $ file = file_get_contents ($ filename);
 $ content = 'Ваш контент'.  $ Файл;
 file_put_contents ($ содержание);  

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

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

Вы можете использовать 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. Откройте файл в режиме w +, а не в режиме +.
  2. Получить длину добавляемого текста ($ chunkLength)
  3. при необходимости установите курсор в начало файла
  4. читать байты $ chunkLength из файла
  5. верните курсор в $ chunkLength * $ i;
  6. написать $ prepend
  7. set $ добавить значение с шага 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); 

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

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

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