在PHP中附加到文件的开头

时间:2013-06-07 07:08:01

标签: php

您好我想使用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);

所以我的最后一个问题是,在所有上述方法中使用的最佳方法(我的意思是最佳)。有可能比上面更好吗?

寻找你对此的想法!!!。

4 个答案:

答案 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)

在文件的第一行之前没有真正有效的方法。你的问题中提到的两个解决方案都创建了一个新文件,从复制旧文件然后编写新数据(这两种方法之间没有太大区别)。

如果您真的追求效率,即避免现有文件的整个副本,并且您需要将最后插入的行作为文件中的第一行,那么这一切都取决于您在创建文件后如何计划使用该文件

三个文件

根据您的评论,您可以创建三个文件headercontentfooter并按顺序输出每个文件;即使在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++;
}
?>