2010-07-26 9 views
9

En PHP, si escribe en un archivo, escribirá el final de ese archivo existente.¿Cómo añado el archivo al principio?

¿Cómo premontamos un archivo para escribir al principio de ese archivo?

He intentado con la función rewind($handle) pero parece sobrescribir si el contenido actual es mayor que el existente.

¿Alguna idea?

+3

La forma no bonita sería leer el contenido del archivo, anteponer lo que tenga y reescribir el archivo completo. No estoy seguro si hay otra manera. Si está haciendo una pequeña modificación a un archivo enorme, entonces esto no es exactamente "ligero", pero si está trabajando en un pequeño archivo de 100 caracteres, todo estará bien. – Warty

+1

¿No te refieres a prepend? –

+0

Es posible que desee hacer esto con las herramientas de UNIX, si esa es una posibilidad: http://stackoverflow.com/questions/54365/prepend-to-a-file-one-liner-shell – deceze

Respuesta

12

La solución file_get_contents es ineficaz para archivos de gran tamaño. Esta solución puede llevar más tiempo, dependiendo de la cantidad de datos que se deben agregar (más es mejor), pero no consumirá memoria.

<?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) dice esto: "... es el preferido forma de leer el contenido de un archivo en una cadena. Utilizará técnicas de mapeo de memoria si su sistema operativo lo admite para mejorar el rendimiento." – alex

+0

@alex Todavía significa que va a leer todo en la memoria de una sola vez. El método de Fraxtil es usar muy poca memoria, pero muchos pasos. Depende de las circunstancias, cuál es más eficiente ... – deceze

+0

@deceze Gracias por la información. – alex

18
$prepend = 'prepend me please'; 

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

$fileContents = file_get_contents($file); 

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

Alex hay una corrección $ fileContents = file_get_contents ($ file); – mathew

+0

@matthew Whoops, gracias por recoger eso. – alex

+0

Alex una pregunta más ... si este es un archivo grande, entonces leer/escribir puede tomar más tiempo, ¿verdad? – mathew

-2

Al utilizar fopen() se puede establecer el modo para seleccionar el puntero (es decir, el begginng o al final

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

'r' Apertura para sólo lectura;.. Lugar el archivo puntero al comienzo de el archivo

'r +' abierto para la lectura y la escritura ;.. Coloque el puntero del archivo en el principio del archivo

+8

todavía sobrescribirá la línea de inicio – mathew

0

Otro (áspero) sugerencia:

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

Esto tiene el inconveniente de utilizar un archivo temporal, pero por lo demás bastante eficiente.

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

Me gusta la compacidad – Cesar

+0

¿Qué es '$ fo' y para qué se usa' $ fow'? – bzeaman

+0

Sí, primero '$ fo' es '$ for', second' $ fo' es '$ fow' debe estar – misima

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

Esto añadirá una línea en blanco en el archivo de texto, así que la próxima vez que se escribe en él que reemplazar la línea en blanco. con una línea en blanco y su cadena.

Este es el único y mejor truco.

Cuestiones relacionadas