• Publicidad

Zippear folder en tiempo real

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

Zippear folder en tiempo real

Notapor Nah » 2005-06-15 18:30 @812

Que onda, ¿cómo les va?

Bueno está este CGI que quiero arreglar, lo que hace es comprimir un folder en un zip, lo genera en tiempo real, el problema es que el código truena y genera un archivo vacío si el folder es muy grande, con folders no tan grandes jala a la perfección,

Mi pregunta es: ¿Cual forma creen que sería la más eficiente para corregir eso?

Mi solución había sido leer el folder y calcular el tamaño de los archivos, dependiendo del tamaño los separaría en los zips que fueran necesarios para que no truene, pero en realidad creo que es muy poco eficiente esto, ¿alguna otra idea?

El código:
Código: Seleccionar todo
sub GetDir
{
   $files_dir = $_[0];
   $zipfile = $_[1];
   opendir(DIR, $files_dir) or die "damn no pude abrir el directorio!";
   @dir = readdir DIR;
   closedir DIR;
   foreach my $item  (@dir)
   {
     $spec = $files_dir . '/' . $item;   
     if (-d $spec)
     {
         unless (length($item)==1)        
         {
           unless(length($item)==2)
           {          
             &GetDir("$spec", $zipfile);
           }
         }      
     }   else {
        $member = $zipfile->addFile("$spec");
     }      
   }
}

if ($dtar ne "") {
   print "Content-Type: application/zip\n\n";
   $file = tmpnam() . ".zip";
   my $zip = Archive::Zip->new();
      GetDir($dtar, $zip);
      $zip->writeToFileNamed("$file");
      open (TMPFILE, $file) || die ("$!");
   print <TMPFILE>;
   close (TMPFILE);
Nah
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2004-06-25 10:36 @483

Publicidad

Notapor kidd » 2005-06-15 19:51 @869

Hola:

Creo que te estás complicando la vida, deberías de usar la función addTree del módulo Archive::Zip:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
  3.  
  4. #Directorio del cual queremos el zip
  5. my $dtar = "./tudirectorio";
  6.  
  7. #Ruta del zip a crear
  8. my $file = "mizip.zip";
  9.  
  10.  
  11.   #Nuevo objeto Archive::Zip
  12.   my $zip = Archive::Zip->new();
  13.  
  14.   #Agregamos el directorio para que lo comprima
  15.     warn "Error al agregar directorio $dtar\n"
  16.       if $zip->addTree( $dtar, $dtar ) != AZ_OK;
  17.  
  18.   #Creamos el nuevo archivo zip
  19.    die 'Error al escribir archivo zip.' if $zip->writeToFileNamed( $file ) != AZ_OK;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Probando este pequeño script en mi computadora hice un zip de un directorio con 358 archivos y 44 subcarpetas con un tamaño de 11 MB en menos de 5 segundos.

NOTA: Si tienes que hacer zips de directorios demasiado grandes y que tome demasiado tiempo, debes de tomar en cuenta que podrías ponerle demasiado load a tu servidor, así que quizá te recomendaría hacer un proceso que corra a ciertas horas del día y te haga los zips, en vez de estarlos creando cada vez que se pidan.


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


Volver a Básico

¿Quién está conectado?

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

cron