Ver Mensaje Individual
  #2 (permalink)  
Antiguo 19/07/2003, 10:52
leonardop
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 8 meses
Puntos: 1
Hola mi amigo,

Es cierto que el modo de apertura `r+' en PHP ubica el apuntador al archivo que retorna, al comienzo del "flujo". Pero esto no quiere decir que cuando escribas información en ese punto, todo el resto del contenido del archivo se "desplaze" consecuentemente.

Por ejemplo, si el contenido original de un archivo cualquiera, digamos "prueba.txt" es el siguiente:

Código:
Esto es una prueba. La manipulación de datos en archivos es sencilla, si uno
tiene cuidado.
Y, mediante un script como el siguiente lo modificas:

Código:
<?php

$ap = fopen ('prueba.txt','r+');

fwrite ($ap, '***escribiendo sobre el archivo***');

fclose($ap);

?>
El resultado final que quedará almacenado en el archivo será el siguiente:

Código:
***escribiendo sobre el archivo***n de datos en archivos es sencilla, si uno
tiene cuidado.
¿Ves lo que ha sucedido? Si lo que quieres es agregar datos al comienzo del archivo sin perder el resto del contenido de éste, tienes que usar otra estrategia. Inicialmente se me ocurren dos, las cuales difieren sutilmente entre sí en el modo en que cumplen con su objetivo.

Si tienes la seguridad de que el archivo sobre el que estás operando no es demasiado grande, y prefieres una solución simple, puedes cargar todo el contenido del archivo en una variable, luego volver al comienzo del archivo, escribir la información nueva y finalmente escribir de nuevo el contenido antiguo:

Código:
<?php

$ap = fopen ('prueba.txt','r+');

$contenido = '';

// Cargar el contenido del archivo en bloques de 4kb.
while (! feof ($ap))
    $contenido .= fread ($ap, 4096);

fseek ($ap, 0, SEEK_SET);  // Volver al comienzo del archivo

fwrite ($ap, '***escribiendo sobre el archivo***' . $contenido);

fclose ($ap);

?>
Ahora bien, si existe una buena probabilidad de que el archivo con el que trabajas sea demasiado grande, cargar todo el contenido de éste en una variable no parece muy buena idea. En ese caso, puedes recurrir a un archivo temporal. Puedes por ejemplo crear un archivo nuevo, escribir allí la información nueva, y después añadirle el contenido del archivo original. Finalmente renombras el archivo temporal para que reemplaze al archivo inicial. Una implementación de esta estrategia podría ser:

Código:
<?php

$nombre_archivo  = 'prueba.txt';
$nombre_temporal = 'temp.txt';

$tmp = fopen ($nombre_temporal, 'w');  // Archivo temporal

fwrite ($tmp, '***escribiendo sobre el archivo***');

$ap = fopen ($nombre_archivo,'r');

// Copiar el contenido del archivo original en el temporal, en bloques
// de 4kb.
while (! feof ($ap))
    fwrite ($tmp, fread ($ap, 4096));

fclose ($tmp);
fclose ($ap);

rename ($nombre_temporal, $nombre_archivo);

?>
Con esta última solución debes asegurarte de darle permisos adecuados a los archivos y al directorio sobre el que trabajas (si trabajas sobre un sistema operativo en donde los permisos tienen sentido).

Bueno, espero que te resulte de ayuda. Saludos.