Foros del Web » Programando para Internet » PHP »

atributo 'r+' borrando contenido?

Estas en el tema de atributo 'r+' borrando contenido? en el foro de PHP en Foros del Web. Ola, tengo este codigo: Código PHP: $option =  $opcion . '.txt' ; $txt_open =  fopen ( $option , 'r+' ); $texto =  '<font color="#990000"><b><a href=info' . $opcion ...
  #1 (permalink)  
Antiguo 18/07/2003, 19:16
Avatar de Ánima  
Fecha de Ingreso: julio-2002
Ubicación: Catalunya, Barcelona.
Mensajes: 538
Antigüedad: 15 años, 5 meses
Puntos: 1
atributo 'r+' borrando contenido?

Ola, tengo este codigo:
Código PHP:
$option$opcion.'.txt';
$txt_openfopen($option,'r+');
$texto'<font color="#990000"><b><a href=info'.$opcion.'.php?$Page='.$leer.'>'.$name.' Enviado por '.$usuario.'</a></b></font>';
fwrite ($txt_open,$texto."\r\n");
fclose($txt_open); 
La cuestion esq con el r+ tenia entendido que se añadía al principio del archivo txt.
Pero no es asi sino que me borra todo el contenido que tenia en ése archivo y solo se muestra el nuevo.
xq?
cual es entonces el atributo q ace eso?
  #2 (permalink)  
Antiguo 19/07/2003, 11:52
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 14 años, 5 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.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 10:02.