2009-11-19 13 views
28

Sto creando questo programma e sto cercando di scoprire come scrivere i dati all'inizio di un file anziché alla fine. "a"/append scrive solo fino alla fine, come posso farlo scrivere all'inizio? Perché "r +" lo fa ma sovrascrive i dati precedenti.È necessario scrivere all'inizio del file con PHP

$datab = fopen('database.txt', "r+"); 

Ecco tutta la mia lima:

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

risposta

47

Il rapido e sporco:

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

penso che non c'è modo migliore per inserire i dati all'inizio del il file. Devi spostare tutti i dati attualmente contenuti nel file comunque. Per i file più grandi potrebbe essere necessario leggere il file parte per parte per adattarlo alla memoria. –

+0

Come usare la modalità "c" di fopen? Questo non scrive all'inizio del file? –

+0

@SSHQuesto sì, ma riscrive anche qualsiasi cosa nel modo :) –

3

Penso che ciò che si può fare prima viene letto il contenuto del file e tenerlo in una variabile temporanea, ora inserisci i nuovi dati all'inizio del file prima di aggiungere anche il contenuto della variabile temporanea.

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

Ehi, grazie dal futuro! Questo ha risolto il mio problema per me. Lo apprezzo ... – Keven

1

Non c'è modo di scrivere l'inizio di un file, come si pensa. Questo è indovinato a causa di come OS e HDD vedono il file. Ha una partenza fissa e una fine espansione. Se si desidera aggiungere qualcosa nel mezzo o all'inizio, è necessario un po 'di scorrimento. Se è un file piccolo, leggi tutto e fai la tua manipolazione e rispondi. Ma se non lo è, e se aggiungi sempre all'inizio l'ordine inverso, considera la fine come inizio ...

1

È possibile utilizzare fseek per modificare il puntatore nella nota.

Si noti che se si utilizza fwrite si cancellerà il contenuto corrente. Quindi in pratica devi leggere l'intero file, usare fseek, scrivere il tuo nuovo contenuto, scrivere i vecchi dati del file.

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

Se il file è davvero enorme e non si desidera utilizzare troppa memoria, si potrebbe desiderare di avere approccio in due file, come

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

La soluzione di Ben sembra essere più semplice secondo la mia onesta opinione

Un ultimo punto: non so cosa si sta immagazzinando in database.txt ma si potrebbe fare lo stesso più facilmente utilizzando un server di database.

30

Se non si desidera caricare l'intero contenuto del file in una variabile, è possibile utilizzare Streams funzionalità di PHP:

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); 
} 

Quello che fa è scrive la stringa che si desidera anteporre ad una temporanea file, quindi scrive il contenuto del file originale alla fine del file temporaneo (utilizzando gli stream invece di copiare l'intero file in una variabile), quindi rimuove il file originale e rinomina il file temporaneo per sostituirlo.

Nota: Questo codice era originariamente basato su un post sul blog di Chao Xu. Da allora il codice è stato divergente, ma il post originale può essere visualizzato in the Wayback Machine.

+0

Thx! Funziona molto bene, ma solo se il file esiste (avevo un caso in cui il file potrebbe essere mancante.) Realmente facile da aggirare: if (! File_exsists ($ nomefile) [...]). – qualbeen

+0

Sì, funziona davvero , ty Jordan –

+1

PHP ha tempnam() per la generazione di un nome file univoco: md5() ha un piccolo rischio di generare una collisione con un file esistente. Vedi http://php.net/manual/en/function.tempnam. php –

1

Questo codice ricorda i dati dall'inizio del file per proteggerli dalla sovrascrittura. Successivamente riscrive tutti i dati esistenti nel file di blocco per pezzo.

$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() e file_put_contents() utilizzare più memoria rispetto utilizzando i fopen(), fwrite(), e fclose() funzioni:

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

Questo non dice nulla sulla funzionalità "prepending" che l'OP stava chiedendo .. –

3

È possibile utilizzare il seguente codice per aggiungere testo all'inizio e alla fine del file.

$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. Aprire un file in modalità non un w + modo +.
  2. Ottenere la lunghezza del testo per aggiungere ($ chunkLength)
  3. impostare un cursore file all'inizio del file, se necessario
  4. leggere $ chunkLength byte dal file
  5. ritorno il cursore a $ chunkLength * $ i;
  6. scrittura $ anteporre
  7. set $ anteporre un valore dal punto 4
  8. fare questi passaggi, mentre 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); 
    
Problemi correlati