Ответ 1
Быстрое и грязное:
<?php
$file_data = "Stuff you want to add\n";
$file_data .= file_get_contents('database.txt');
file_put_contents('database.txt', $file_data);
?>
Я делаю эту программу, и я пытаюсь выяснить, как писать данные в начале файла, а не в конец. "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>
Быстрое и грязное:
<?php
$file_data = "Stuff you want to add\n";
$file_data .= file_get_contents('database.txt');
file_put_contents('database.txt', $file_data);
?>
Если вы не хотите загружать все содержимое файла в переменную, вы можете использовать функцию 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.
Я думаю, что вы можете сначала прочитать содержимое файла и удерживать его во временной переменной, теперь вставьте новые данные в начало файла, а затем добавьте содержимое временной переменной.
$file = file_get_contents($filename); $content = 'Your Content' . $file; file_put_contents($content);
выполните следующие действия, а 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);
Вы можете использовать следующий код для добавления текста в начале и конце файла.
$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);
Нет способа записать в начало файла, как вы думаете. Это, я думаю, объясняется тем, как ОС и HDD видят файл. У этого есть фиксированный старт и расширяющийся конец. Если вы хотите что-то добавить в середине или начать, это требует некоторого скольжения. Если это небольшой файл, просто прочитайте все и выполните свои манипуляции и напишите. Но если нет, и если вы всегда добавляете в начало просто обратный порядок строк, рассмотрите конец как начало...
Вы можете использовать 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
, но вы можете сделать то же самое проще с помощью сервера базы данных.
Этот код запоминает данные с начала файла, чтобы защитить их от перезаписывания. Затем он перезаписывает все данные, хранящиеся в куске файла, на куске.
$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);
file_get_contents()
и file_put_contents()
использовать больше памяти, чем использовать функции fopen()
, fwrite()
и fclose()
:
$fh = fopen($filename, 'a') or die("can't open file");
fwrite($fh, $fileNewContent);
fclose($fh);