您好我想使用php在文件的开头追加一行。
让我们说例如该文件包含以下contnet:
Hello Stack Overflow, you are really helping me a lot.
现在我想在这样的反复意见之上添加一行:
www.stackoverflow.com
Hello Stack Overflow, you are really helping me a lot.
这是我目前在脚本中的代码。
$fp = fopen($file, 'a+') or die("can't open file");
$theOldData = fread($fp, filesize($file));
fclose($fp);
$fp = fopen($file, 'w+') or die("can't open file");
$toBeWriteToFile = $insertNewRow.$theOldData;
fwrite($fp, $toBeWriteToFile);
fclose($fp);
我想要一些最佳解决方案,因为我在php脚本中使用它。以下是我在这里找到的一些解决方案: Need to write at beginning of file with PHP
表示在开头追加以下内容:
<?php
$file_data = "Stuff you want to add\n";
$file_data .= file_get_contents('database.txt');
file_put_contents('database.txt', $file_data);
?>
另一个在这里: Using php, how to insert text without overwriting to the beginning of a text file
说:
$old_content = file_get_contents($file);
fwrite($file, $new_content."\n".$old_content);
所以我的最后一个问题是,在所有上述方法中使用的最佳方法(我的意思是最佳)。有可能比上面更好吗?
寻找你对此的想法!!!。
答案 0 :(得分:5)
function file_prepend ($string, $filename) {
$fileContent = file_get_contents ($filename);
file_put_contents ($filename, $string . "\n" . $fileContent);
}
用法:
file_prepend("couldn't connect to the database", 'database.logs');
答案 1 :(得分:1)
撰写文件时,我个人的偏好是使用file_put_contents
从手册:
此函数与调用fopen(),fwrite()和fclose()相同 先后将数据写入文件。
因为函数会自动为我处理这三个函数,所以在完成后我不必记得关闭资源。
答案 2 :(得分:1)
在文件的第一行之前没有真正有效的方法。你的问题中提到的两个解决方案都创建了一个新文件,从复制旧文件然后编写新数据(这两种方法之间没有太大区别)。
如果您真的追求效率,即避免现有文件的整个副本,并且您需要将最后插入的行作为文件中的第一行,那么这一切都取决于您在创建文件后如何计划使用该文件
三个文件
根据您的评论,您可以创建三个文件header
,content
和footer
并按顺序输出每个文件;即使在header
之后创建content
,也会避免复制。
在一个文件中反向工作
此方法将文件放入内存(数组) 既然你知道你在标题之前创建了内容,那么总是以相反的顺序写行,页脚,内容然后标题:
function write_reverse($lines, $file) { // $lines is an array
for($i=count($lines)-1 ; $i>=0 ; $i--) fwrite($file, $lines[$i]);
}
然后你先用页脚调用write_reverse()
,然后是内容,最后是标题。每次你想在文件的开头添加一些内容时,只需在最后写一下......
然后读取输出文件
$lines = array();
while (($line = fgets($file)) !== false) $lines[] = $line;
// then print from last one
for ($i=count($lines)-1 ; $i>=0 ; $i--) echo $lines[$i];
然后还有另一个考虑因素:你可以完全避免使用文件 - 例如通过PHP APC
答案 3 :(得分:1)
你的意思是前期。我建议您阅读该行并将其替换为下一行,而不会丢失数据。
<?php
$dataToBeAdded = "www.stackoverflow.com";
$file = "database.txt";
$handle = fopen($file, "r+");
$final_length = filesize($file) + strlen($dataToBeAdded );
$existingData = fread($handle, strlen($dataToBeAdded ));
rewind($handle);
$i = 1;
while (ftell($handle) < $final_length)
{
fwrite($handle, $dataToBeAdded );
$dataToBeAdded = $existingData ;
$existingData = fread($handle, strlen($dataToBeAdded ));
fseek($handle, $i * strlen($dataToBeAdded ));
$i++;
}
?>