2010-07-26 10 views
9

In PHP, wenn Sie in eine Datei schreiben, wird es Ende der vorhandenen Datei schreiben.Wie stelle ich die Datei am Anfang voran?

Wie fügen wir eine Datei am Anfang dieser Datei vor?

Ich habe versucht, rewind($handle) Funktion, aber scheint zu überschreiben, wenn der aktuelle Inhalt größer als vorhanden ist.

Irgendwelche Ideen?

+3

Nicht-schöne Art wäre, Dateiinhalte zu lesen, vorzuführen, was auch immer Sie haben, und die gesamte Datei neu schreiben. Nicht sicher, ob es einen anderen Weg gibt. Wenn Sie eine kleine Änderung an einer großen Datei vornehmen, ist das nicht gerade "leicht", aber wenn Sie an einer kleinen 100-Zeichen-Datei arbeiten, ist das in Ordnung. – Warty

+1

Meinst du nicht vorgeben? –

+0

Sie können dies mit UNIX-Tools tun, wenn das eine Möglichkeit ist: http://stackoverflow.com/questions/54365/prepend-to-a-file-one-liner-shell – deceze

Antwort

12

Die Lösung file_get_contents ist für große Dateien ineffizient. Diese Lösung kann länger dauern, abhängig von der Menge der Daten, die vorangestellt werden müssen (mehr ist eigentlich besser), aber sie wird nicht viel Speicher verbrauchen.

<?php 

$cache_new = "Prepend this"; // this gets prepended 
$file = "file.dat"; // the file to which $cache_new gets prepended 

$handle = fopen($file, "r+"); 
$len = strlen($cache_new); 
$final_len = filesize($file) + $len; 
$cache_old = fread($handle, $len); 
rewind($handle); 
$i = 1; 
while (ftell($handle) < $final_len) { 
    fwrite($handle, $cache_new); 
    $cache_new = $cache_old; 
    $cache_old = fread($handle, $len); 
    fseek($handle, $i * $len); 
    $i++; 
} 
?> 
+2

'file_get_contents()' [docs] (http://php.net/manual/en/function.file-get-contents.php) sagt dies: "... ist die bevorzugte Möglichkeit, den Inhalt einer Datei in eine Zeichenkette einzulesen, wenn sie von Ihrem Betriebssystem unterstützt wird, um die Leistung zu verbessern." – alex

+0

@alex Es bedeutet immer noch, dass es das ganze Ding auf einmal in den Speicher einlesen wird. Fraxtils Methode benutzt sehr wenig Speicher, aber eine Menge Schritte. Es kommt auf die Umstände an, wo man effizienter ist ... – deceze

+0

@deceze Danke für die Info – alex

18
$prepend = 'prepend me please'; 

$file = '/path/to/file'; 

$fileContents = file_get_contents($file); 

file_put_contents($file, $prepend . $fileContents); 
+0

Alex gibt es eine Korrektur $ fileContents = file_get_contents ($ datei); – mathew

+0

@matthew Hoppla, vielen Dank für das Abholen. – alex

+0

Alex noch eine Frage..wenn dies eine große Datei ist, dann lesen/schreiben kann mehr Zeit in Anspruch nehmen ?? – mathew

-2

Wenn fopen() können Sie den Modus stellen Sie den Zeiger (dh die begginng oder Ende zu setzen

$afile = fopen("file.txt", "r+"); 

'r' Open zum Lesen nur,.. Ort die Datei Zeiger am Anfang die Datei

‚r +‘ Open zum Lesen und Schreiben ;.. Ort der Dateizeiger am Anfang der Datei

+8

wird es immer noch Anfang Zeile überschreiben – mathew

0

Weitere (rau) Vorschlag:

$tempFile = tempnam('/tmp/dir'); 
$fhandle = fopen($tempFile, 'w'); 
fwrite($fhandle, 'string to prepend'); 

$oldFhandle = fopen('/path/to/file', 'r'); 
while (($buffer = fread($oldFhandle, 10000)) !== false) { 
    fwrite($fhandle, $buffer); 
} 

fclose($fhandle); 
fclose($oldFhandle); 

rename($tempFile, '/path/to/file'); 

Dies hat den Nachteil, eine temporäre Datei verwenden, ist aber ansonsten ziemlich effizient.

3
$filename = "log.txt"; 
$file_to_read = @fopen($filename, "r"); 
$old_text = @fread($file_to_read, 1024); // max 1024 
@fclose(file_to_read); 
$file_to_write = fopen($filename, "w"); 
fwrite($file_to_write, "new text".$old_text); 
+0

Ich mag die Kompaktheit – Cesar

+0

Was ist '$ fo' und was ist' $ fow' verwendet für? – bzeaman

+0

Ja, zuerst '$ fo' ist '$ für', zweites' $ fo' ist '$ fow' muss sein – misima

-2
  $file = fopen('filepath.txt', 'r+') or die('Error'); 
      $txt = "/n".$string; 
      fwrite($file, $txt); 
      fclose($file); 

Dies wird eine leere Zeile in der Textdatei, so dass beim nächsten Mal, wenn Sie es schreiben, fügen Sie die leere Zeile ersetzen. mit einer leeren Zeile und Ihrer Zeichenfolge.

Dies ist der einzige und beste Trick.

Verwandte Themen