2009-11-19 69 views
28

我正在编写这个程序,我正在试图找出如何将数据写入文件的开头而不是结尾。 “a”/ append只写到最后,我怎样才能让它写入开头?因为“r +”这样做,但会覆盖以前的数据。需要使用PHP编写文件开头

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

回答

47

的快速和肮脏的:

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

我觉得有没有更好的办法在开始时插入数据文件。无论如何,您必须移动当前包含在文件中的所有数据。对于较大的文件,您可能需要逐个读取文件以适应内存。 – 2009-11-19 02:43:53

+0

如何使用fopen的“c”模式?这不写入文件的开始? – 2012-05-02 00:37:45

+0

@SSHThis是的,但它也改写方式:) – 2014-04-10 16:23:40

3

我认为你可以做的是先读取文件的内容,并保持在一个临时变量,现在将新数据插入到文件的开头,然后再附加临时变量的内容。

 
$file = file_get_contents($filename); 
$content = 'Your Content' . $file; 
file_put_contents($content); 
+1

嘿,未来感谢!这解决了我的问题。我很感激... – Keven 2013-09-15 04:18:40

1

没有办法像你想的那样写入文件的开头。这是我想由于操作系统和硬盘驱动器看到文件的原因。它有一个固定的开始和扩大结束。如果你想在中间添加东西或者开始下滑,那就需要一些滑动。如果它是一个小文件,只需全部阅读并进行操作并写回。但是,如果不是,并且如果您总是在开始时添加倒序行顺序,请考虑以结尾为开始...

1

您可以使用​​来更改笔记中的指针。

必须注意的是,如果您使用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中备货的情况,但您可以使用数据库服务器更轻松地进行操作。

30

如果您不希望将文件的全部内容加载到一个变量,你可以使用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); 
} 

这样做是写入字符串要在前面加上一个临时文件,那么它会将原始文件的内容写入临时文件的末尾(使用流而不是将整个文件复制到变量中),然后删除原始文件并重命名临时文件以替换它。

说明:此代码最初是基于Chao Xu现已不存在的博客文章。此后代码已经发生分歧,但原始帖子可以查看in the Wayback Machine

+0

Thx!这很好,但只有当文件存在(我有一个情况下文件可能会丢失。真的很容易解决:if(!file_exsists($ filename)[...])。 – qualbeen 2011-12-06 15:29:51

+0

是的,这真的工作,ty Jordan – 2012-05-02 01:08:41

+1

PHP有tempnam()用于生成唯一的文件名.md5()与现有文件产生冲突的风险很小。请参阅http://php.net/manual/en/function.tempnam。 php – 2015-03-19 10:13:40

1

该代码记录文件开头的数据以防止它们被覆盖。接下来,它按块重写文件块中存在的所有数据。

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

file_get_contents()file_put_contents()使用更多的内存比使用fopen()fwrite()fclose()功能:

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

这并没有说明OP所要求的“预计”功能。 – 2016-07-16 19:20:28

3

您可以使用下面的代码在文件的开头和结尾追加文本。

$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); 
2
  1. 公开赛在W +模式不是一个+模式下的文件。
  2. 获取文本的长度来增加($ chunkLength)
  3. 设置文件光标移动到文件的开头,如果需要
  4. 读$ chunkLength从文件的字节
  5. 回报光标到$ chunkLength * $ I;
  6. 写$前插
  7. 集$前置步骤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);