• Publicidad

Se crea archivo vacío

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Se crea archivo vacío

Notapor dldominguez » 2011-04-14 15:49 @701

Buen día,

Me ha parecido fantástico el foro, soy nuevo en Perl; me ha parecido fantástico al igual que sus aportes, me han servido muchísimo pero ahora tengo un problema: estoy realizando mantenimiento a una aplicación que se encarga de leer un archivo .xls; éste a su vez crea un archivo temporal con el siguiente código...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open( OUTFILE, ">$dir/$fname" ) or die print "No se puedo leer el archivo...";
  2. binmode(OUTFILE);                      #Para no tener problemas en Windows
  3.  
  4. #Transferencia byte por byte
  5. while ( my $bytesread = read( $fname_s, my $buffer, 1024 ) ) {
  6.     print OUTFILE $buffer;
  7. }
  8.  
  9. #Cerramos el archivo creado
  10. close(OUTFILE);
  11.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


y sí, efectivamente, crea el archivo en la ruta indicada pero no pasa los datos. Ese archivo nuevo queda vacío, y claro, al leerlo dice que no tengo datos. ¿Me podrían colaborar con esto? Muchas gracias..
dldominguez
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-04-14 15:43 @696

Publicidad

Re: Se crea archivo vacío

Notapor explorer » 2011-04-14 16:05 @711

Bienvenido a los foros de Perl en español, dldominguez.

¿$fname_s contiene el controlador de acceso al fichero a leer?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Se crea archivo vacío

Notapor dldominguez » 2011-04-14 16:27 @727

¡Ah, ok!, mira, este es el código completo de la función... Por cierto, no sé qué hace la primera fila.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub carga_archivo {
  2.  
  3.     my $fname_s = shift;               # No sé qué hace esta línea...
  4.  
  5.     my ( $seg, $min, $hor, $dia, $mes, $anno );
  6.     ( $seg, $min, $hor, $dia, $mes, $anno ) = (localtime)[ 0, 1, 2, 3, 4, 5 ];
  7.  
  8.     #Se suma  uno a la variable mes  debido a que la funcion  localtime,
  9.     #retorna el mes menos uno.
  10.     $mes++;
  11.     $dia = length($dia) == 1 ? "0$dia" : $dia;
  12.     $mes = length($mes) == 1 ? "0$mes" : $mes;
  13.     $anno += 1900;
  14.  
  15.     my $fname = $fname_s;
  16.     $fname =~ s/ /_/gi;
  17.     $fname =~ /(\w+)\.(\w+)$/;
  18.     $fname = $1 . $anno . $mes . $dia . $hor . $min . $seg . "." . $2;
  19.  
  20.     my $extension_correcta = 0;
  21.     my $cont               = 0;
  22.  
  23.     foreach (@extensiones) {
  24.         if ( $fname =~ /\.$_$/i ) {
  25.             $extension_correcta = 1;
  26.             $ext                = $cont;
  27.             last;
  28.         }
  29.         $cont++;
  30.     }
  31.  
  32.     if ($extension_correcta) {
  33.         open( OUTFILE, ">$dir/$fname" )
  34.             or die print "No se puedo leer el archivo...";
  35.         binmode(OUTFILE);              #Para no tener problemas en Windows
  36.  
  37.         # Transferencia byte por byte
  38.         while ( my $bytesread = read( $fname_s, my $buffer, 1024 ) ) {
  39.             print OUTFILE $buffer;
  40.         }
  41.  
  42.         #Cerramos el archivo creado
  43.         close(OUTFILE);
  44.  
  45.     }
  46.  
  47.     else {
  48.         print "<center><b><i>Extension incorrecta";
  49.         print "<br>Sólo se reciben archivos con extension: ";
  50.         print join( ",", @extensiones );
  51.         print "</i></b></center>";
  52.         exit;
  53.     }
  54.  
  55.     return "$dir/$fname_s";
  56.  
  57. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
dldominguez
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-04-14 15:43 @696

Re: Se crea archivo vacío

Notapor explorer » 2011-04-14 17:13 @759

La línea 3 pasa el primer argumento pasado a la subrutina carga_archivo() a la variable $fname_s, que, viendo el resto del programa, guarda el nombre de un fichero.

Y esa es, también, la razón por la cual falla la línea 38: no se puede usar el nombre de un fichero como primer argumento de la función read(). Antes hay que abrir el fichero, y usar el controlador de acceso de ese fichero como argumento a read(). Bueno... excepto si $fname_s sea un objeto IO::Handle... pero no lo creo...

Sería algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open(my $fh, '<', $fname_s) or die "ERROR: no pude abrir el fichero $fname_s: $!\n";
  2. binmode $fh;                           # modo binario
  3. read( $fh, my $buffer, -s $fname_s );  # leemos todo el fichero (el operador -s da la longitud del fichero)
  4. close $fh;
  5. print OUTFILE $buffer;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El problema sería, si $fname_s no está en el mismo directorio en donde estamos trabajando. Habría que poner, en el open() y en el -s, la ruta correcta hacia el fichero.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Se crea archivo vacío

Notapor pvaldes » 2011-04-15 04:06 @212

No acabo de entender para qué creas la variable $bytesread si luego no la llegas a usar, es probable que puedas simplificar esa última parte.

EDITO: ¡Ah!, ya veo que explorer se ocupa de ese tema en el post.
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Se crea archivo vacío

Notapor dldominguez » 2011-04-19 11:41 @528

Muchas gracias por su ayuda, me ha servido mucho... En el futuro los seguiré molestando con más dudas. Gracias.
dldominguez
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-04-14 15:43 @696


Volver a Básico

¿Quién está conectado?

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