• Publicidad

Manejo de ficheros

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Manejo de ficheros

Notapor davidlo » 2007-02-07 11:48 @533

Hola, me he incorporado hace poco al mundillo Perl y necesito ayuda con el problema siguiente. Tengo un objeto que, al construirlo, debe crear un fichero datos_id.dat . El identificador id es característico del objeto. En principio esta vacío, sólo debe crearlo. El código correspondiente, que reproduzco a continuación, funciona correctamente. He aquí el constructor:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub new {
   
my $clase = shift;
my $id = shift;

my $self ={};
$self->{id}=$id;

my $fh = IO::File->new();
my $nombreFich = "datos_$id.dat";

$self->{nombreFich}=$nombreFich;
   
# Abrimos el fichero

if (!($fh->open("+>./datos/$nombreFich"))){
      print("Fallo al crear el fichero de datos\n");
      $fh=undef;
   }else{
      print "Fichero abierto con éxito\n";
      $fh->autoflush(1);
   }

    $self->{manipulador}=$fh;

    bless($self, $clase);

    return $self;
}

 
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


En el transcurso posterior de la aplicación se guardarán datos de configuración útiles mientras esté abierta la misma. Se pretende que posteriores sesiones de la aplicación puedan recuperar esos datos y no partan de cero. Para ello, al cerrar la aplicación (o al destruir el objeto) se guarda el fichero datos_id.dat renombrado como datos_id.old .

Debo hacer unas modificaciones para que, al crear el objeto:

1) En primer lugar se debe comprobar si existe un fichero datos_id.old .

2.1) SI NO EXISTE, se creará un nuevo fichero datos_id.dat tal como está arriba.

2.2) SI EXISTE, ése es el fichero que hay que tomar: se debe hacer una copia llamada datos_id.dat y abrirla.


¿Alguien puede ayudarme un poco?

Gracias.
davidlo
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2006-11-11 05:58 @290
Ubicación: Sevilla, España

Publicidad

Notapor kidd » 2007-02-07 12:40 @569

Hola:

Para verificar si el archivo existe puedes hacer lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    if( -e "./datos/$nombreFich" ){
        #el archivo existe
    }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Para hacer la copia o mover un archivo te recomiendo el módulo File::Copy que te da una interfase bastante sencilla:
http://search.cpan.org/~nwclark/perl-5. ... le/Copy.pm


Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor davidlo » 2007-02-08 05:04 @252

Muchas gracias Kidd, de todas formas cuando he leído tu respuesta ya había llegado a una solución, quizá no sea la más elegante pero a mí me sirve de momento.
Adjunto el código por si a alguien le interesa:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub new {

my $clase = shift;
my $id = shift;

my $self ={};
$self->{id}=$id;

my $fh = IO::File->new();


my $nombreFich = "datos_$id.dat";
$self->{nombreFich}=$nombreFich;
   
my $fh_old = IO::File->new();
my $nombreFich_old = "datos_$id.old";
   
my $aux1 ;


    if (($fh_old->open("<./datos/$nombreFich_old"))){

        if(($fh->open("+>./datos/$nombreFich"))){
       
               $fh->autoflush(1);
         
               $aux1 = <$fh_old>;
         
               while ($aux1){
               
                  $fh->write($aux1);
                  $aux1 = <$fh_old>;
                }
         
              undef $fh_old;       # automatically closes the file
 
         

         
         }else{
                print "ERROR AL ABRIR FICHERO $nombreFich\n";
                }
         
         }elsif (!($fh->open("+>./datos/$nombreFich"))){
            print("Fallo al crear el fichero de datos\n");
            $fh=undef;
        }else{
            print "Fichero abierto con éxito\n";
            $fh->autoflush(1);
        }


    $self->{manipulador}= $fh;
   
    bless($self, $clase);

    return $self;
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
davidlo
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2006-11-11 05:58 @290
Ubicación: Sevilla, España


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 19 invitados

cron