4

您好我想使用 php 在文件的开头追加一行。

例如,该文件包含以下内容:

    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 脚本中使用它。以下是我在这里找到的一些解决方案: 需要用 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,如何插入文本而不覆盖到文本文件的开头

说:

    $old_content = file_get_contents($file);
    fwrite($file, $new_content."\n".$old_content);

所以我的最后一个问题是,在所有上述方法中,哪种方法是最好的(我的意思是最优的)。还有比上面更好的吗?

寻找您对此的想法!!!!

4

4 回答 4

7
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');
于 2013-06-07T07:24:57.460 回答
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++;
}
?>
于 2013-06-07T07:51:57.563 回答
1

我在写入文件时的个人偏好是使用file_put_contents

从手册:

该函数等同于依次调用 fopen()、fwrite() 和 fclose() 将数据写入文件。

因为该函数会自动为我处理这三个函数,所以我不必记住在完成后关闭资源。

于 2013-06-07T07:20:17.050 回答
1

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

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

三个文件

根据您的评论,您可以创建三个文件headercontent并按footer顺序输出每个文件;即使headercontent.

在一个文件中反向工作

此方法将文件放入内存(数组)中。
因为你知道你在页眉之前创建内容,所以总是以相反的顺序写行,页脚,内容,然后是页眉:

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

于 2013-06-07T07:41:41.787 回答