Foros del Web » Programando para Internet » PHP »

Comprimir directorio entero

Estas en el tema de Comprimir directorio entero en el foro de PHP en Foros del Web. Hola, necesito comprimir en zip, tar.gz, cualquiera.. un directorio entero. Por ej, tengo ./hola con 5 archivos dentro (1.php, index.php, etc) y otro directorio con ...
  #1 (permalink)  
Antiguo 11/07/2011, 05:54
 
Fecha de Ingreso: noviembre-2010
Mensajes: 1.242
Antigüedad: 13 años, 5 meses
Puntos: 73
Comprimir directorio entero

Hola, necesito comprimir en zip, tar.gz, cualquiera.. un directorio entero.

Por ej, tengo ./hola con 5 archivos dentro (1.php, index.php, etc) y otro directorio con a su vez un archivo dentro.

Comprimir el directorio hola con todo su contenido al igual que cuando se comprime en el pc.

Espero que puedan orientarme un poco tras mucho goglear lo único que conseguí es comprimir los archivos, pero hay que dar la orden de añadirlo uno a uno.

Saludos!
__________________
:)
  #2 (permalink)  
Antiguo 11/07/2011, 06:01
Avatar de iviamontes  
Fecha de Ingreso: enero-2011
Ubicación: $cubano->Arg->Mendoza
Mensajes: 1.184
Antigüedad: 13 años, 3 meses
Puntos: 209
Respuesta: Comprimir directorio entero

tienes que hacer tu propia función recursiva
__________________
aconcaguaestudio.com
  #3 (permalink)  
Antiguo 11/07/2011, 06:08
 
Fecha de Ingreso: noviembre-2010
Mensajes: 1.242
Antigüedad: 13 años, 5 meses
Puntos: 73
Respuesta: Comprimir directorio entero

¿Pero que repito varias veces?

¿Te refieres a que tengo que ir generando el zip fichero a fichero y directorio a directorio?

Me explico mejor, utilicé las librerías zipfile y zipfolder pero busco una librería que sirva para comprimir el directorio entero con todo su contenido
__________________
:)
  #4 (permalink)  
Antiguo 11/07/2011, 06:12
Avatar de iviamontes  
Fecha de Ingreso: enero-2011
Ubicación: $cubano->Arg->Mendoza
Mensajes: 1.184
Antigüedad: 13 años, 3 meses
Puntos: 209
Respuesta: Comprimir directorio entero

mira esto no lo he probado todavía

http://www.webestilo.com/php/cod.phtml?id=6

te agradecería si comentaras si te funciona
__________________
aconcaguaestudio.com
  #5 (permalink)  
Antiguo 11/07/2011, 06:17
Avatar de iviamontes  
Fecha de Ingreso: enero-2011
Ubicación: $cubano->Arg->Mendoza
Mensajes: 1.184
Antigüedad: 13 años, 3 meses
Puntos: 209
Respuesta: Comprimir directorio entero

mira aca gatorV explica
http://www.forosdelweb.com/f18/compr...6/#post2308897
__________________
aconcaguaestudio.com
  #6 (permalink)  
Antiguo 11/07/2011, 06:53
 
Fecha de Ingreso: noviembre-2010
Mensajes: 1.242
Antigüedad: 13 años, 5 meses
Puntos: 73
Respuesta: Comprimir directorio entero

Ambos ejemplos hacen lo que ya conseguí, hay que especificar lo que añadir archivo a archivo.

Querría poder comprimirlo entero, por ej decir "Comprimo el httpdocs del dominio example.com" y lo incluya todo lo que tenga.

Gracias por tus aportes
__________________
:)
  #7 (permalink)  
Antiguo 11/07/2011, 07:06
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Comprimir directorio entero

Fuente: http://es.php.net/manual/es/function.readdir.php#90941

Función:
Código PHP:
  function process_dir($dir,$recursive FALSE) {
    if (
is_dir($dir)) {
      for (
$list = array(),$handle opendir($dir); (FALSE !== ($file readdir($handle)));) {
        if ((
$file != '.' && $file != '..') && (file_exists($path $dir.'/'.$file))) {
          if (
is_dir($path) && ($recursive)) {
            
$list array_merge($listprocess_dir($pathTRUE));
          } else {
            
$entry = array('filename' => $file'dirpath' => $dir);

 
//---------------------------------------------------------//
 //                     - SECTION 1 -                       //
 //          Actions to be performed on ALL ITEMS           //
 //-----------------    Begin Editable    ------------------//

  
$entry['modtime'] = filemtime($path);

 
//-----------------     End Editable     ------------------//
            
do if (!is_dir($path)) {
 
//---------------------------------------------------------//
 //                     - SECTION 2 -                       //
 //         Actions to be performed on FILES ONLY           //
 //-----------------    Begin Editable    ------------------//

  
$entry['size'] = filesize($path);
  if (
strstr(pathinfo($path,PATHINFO_BASENAME),'log')) {
    if (!
$entry['handle'] = fopen($path,r)) $entry['handle'] = "FAIL";
  }
 
 
//-----------------     End Editable     ------------------//
              
break;
            } else {
 
//---------------------------------------------------------//
 //                     - SECTION 3 -                       //
 //       Actions to be performed on DIRECTORIES ONLY       //
 //-----------------    Begin Editable    ------------------//

 //-----------------     End Editable     ------------------//
              
break;
            } while (
FALSE);
            
$list[] = $entry;
          }
        }
      }
      
closedir($handle);
      return 
$list;
    } else return 
FALSE;
  } 
Uso:
Código PHP:
$result process_dir('C:/webserver/Apache2/httpdocs/processdir',TRUE);

 
// Output each opened file and then close
  
foreach ($result as $file) {
    if (
is_resource($file['handle'])) {
        echo 
"\n\nFILE (" $file['dirpath'].'/'.$file['filename'] . "):\n\n" fread($file['handle'], filesize($file['dirpath'].'/'.$file['filename']));
        
fclose($file['handle']);
    }
  } 
Es una función recursiva que te devuelve un array de todos los ficheros en el directorio... y subsiguientes directorios.

Simplemente, luego en el foreach (el que está en el uso) deberías hacer un add_file o similar!

Espero que te sirva!

PD: Lee la explicación en la fuente, te quedará más claro!
  #8 (permalink)  
Antiguo 11/07/2011, 07:08
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 1 mes
Puntos: 253
Respuesta: Comprimir directorio entero

Yo me encontré con este problema hace algún tiempo y no se puede hacer todo de una vez. No existe una función (o no la encontré) que te comprimiera el directorio completo.

Tienes que montarte una función para hacerlo, yo tenía una montada por ahí para directorios con un único nivel de profundidad. Es decir, hacía un opendir y un read para sacar todos los archivos e iteraba sobre el resultado para ir añadiendo uno a uno al fichero ZIP, contando que sólo hubiera archivos, si dentro de la carpeta que quieres comprimir tienes más carpetas la cosa se complica un poco.

A ver si encuentro la función y te la puedo poner, para que empieces al menos. Esta tarde te miro, que ahora estoy en el curro.

Un saludo.
  #9 (permalink)  
Antiguo 11/07/2011, 07:08
Avatar de iviamontes  
Fecha de Ingreso: enero-2011
Ubicación: $cubano->Arg->Mendoza
Mensajes: 1.184
Antigüedad: 13 años, 3 meses
Puntos: 209
Respuesta: Comprimir directorio entero

por eso te decia lo de recursividad, mira
haz una función que lea todos los archivos y directorios contenidos en la direccion que le pasas
con
$dir_handle = @opendir("../es") or die("Unable to open $path");
while ($file = @readdir($dir_handle))
{

}
te puedes manejar, entonces usando la funcion is_dir() preguntas si es un direcorio y lo recorres de nuevo
con esta funcion recursiva tienes todos los archivos y directorios y los vas a ir zippeando con addFile()
__________________
aconcaguaestudio.com
  #10 (permalink)  
Antiguo 11/07/2011, 07:09
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 1 mes
Puntos: 253
Respuesta: Comprimir directorio entero

Se me adelantó Eleazan, ahí tienes la función.

Un saludo.
  #11 (permalink)  
Antiguo 11/07/2011, 07:13
 
Fecha de Ingreso: noviembre-2010
Mensajes: 1.242
Antigüedad: 13 años, 5 meses
Puntos: 73
Respuesta: Comprimir directorio entero

Hola,

Modifique lo último de tu código, me dio un resultado muy raro, como si quisiese incluir la imagen en texto plano...

Dejo el resultado:

Código PHP:
Ver original
  1. $result = process_dir('img/',TRUE);
  2.  
  3.  // Output each opened file and then close
  4.   foreach ($result as $file) {
  5.     if (is_resource($file['handle'])) {
  6.        // echo "\n\nFILE (" . $file['dirpath'].'/'.$file['filename'] . "):\n\n" . fread($file['handle'], filesize($file['dirpath'].'/'.$file['filename']));
  7.        //fclose($file['handle']);
  8.        echo $file['dirpath'].'/'.$file['filename'] . '<br>';
  9.     }
  10.   }

Eso es mas lo que necesito, luego iré añadiendo en vez de con echo, lo añadiré al zip. Voy a ver que sale y lo comparto luego
__________________
:)
  #12 (permalink)  
Antiguo 11/07/2011, 07:29
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Comprimir directorio entero

Esa función hace muchas cosas que no necesitas... deberías mirarla bien y quitarle cosas xD

Era para que vieras como hacia la recursividad, más que nada. El $file['handle'] creo que es el fopen xD

De hecho, deberías borrar
Código PHP:
$entry['size'] = filesize($path);
  if (
strstr(pathinfo($path,PATHINFO_BASENAME),'log')) {
    if (!
$entry['handle'] = fopen($path,r)) $entry['handle'] = "FAIL";
  } 
de la función. Y el
Código PHP:
 if (is_resource($file['handle'])) { 
del foreach ;)
  #13 (permalink)  
Antiguo 11/07/2011, 07:42
 
Fecha de Ingreso: noviembre-2010
Mensajes: 1.242
Antigüedad: 13 años, 5 meses
Puntos: 73
Respuesta: Comprimir directorio entero

Borré lo que dijiste de la función, cosa que borró un error que daba jejej y edité el uso a
Código PHP:
Ver original
  1. // Output each opened file and then close
  2.   foreach ($result as $file) {
  3.        $file_e= $file['dirpath'].$file['filename'] ;
  4.        if (is_dir($file_e)) {
  5.        echo "<b>Directorio: </b>";
  6.        } else {
  7.        echo "<b>Archivo: </b>";
  8.        }
  9.        echo $file_e;
  10.        echo "<br>";
  11.       }

Ahora de un resultado tipo:

Código Texto plano:
Ver original
  1. Directorio: img/123
  2. Archivo: img/1.php
  3. Archivo: img/2.php

Ya solo queda implementar la librería zip file y estará listo el script

Gracias a todos por ayudarme, voy a intentar que comprima y ahora vengo con el resultado o la duda
__________________
:)
  #14 (permalink)  
Antiguo 11/07/2011, 07:53
 
Fecha de Ingreso: noviembre-2010
Mensajes: 1.242
Antigüedad: 13 años, 5 meses
Puntos: 73
Respuesta: Comprimir directorio entero

¿Abro un nuevo tema o continuo en este con el comprimido?

Me gustaría acabar con una función a la que le de el directorio y la ruta donde guardar el zip, y ella ya haga el resto.

+K por la ayuda
__________________
:)
  #15 (permalink)  
Antiguo 11/07/2011, 08:05
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Comprimir directorio entero

Puedes usar SPL, con DirectoryIterator, RecursiveDirectoryIterator, FilterIterator para poder leer por todos los directorios y listar los archivos e irlos añadiendo al zip.

Saludos.
  #16 (permalink)  
Antiguo 11/07/2011, 08:10
 
Fecha de Ingreso: noviembre-2010
Mensajes: 1.242
Antigüedad: 13 años, 5 meses
Puntos: 73
Problema con comprimir todo el directorio

Gracias al otro post (http://www.forosdelweb.com/f18/compr...entero-928286/) conseguí esto:

Código PHP:
Ver original
  1. function process_dir($dir,$recursive = FALSE) {
  2.     if (is_dir($dir)) {
  3.       for ($list = array(),$handle = opendir($dir); (FALSE !== ($file = readdir($handle)));) {
  4.         if (($file != '.' && $file != '..') && (file_exists($path = $dir.'/'.$file))) {
  5.           if (is_dir($path) && ($recursive)) {
  6.             $list = array_merge($list, process_dir($path, TRUE));
  7.           } else {
  8.             $entry = array('filename' => $file, 'dirpath' => $dir);
  9.  
  10.  //---------------------------------------------------------//
  11.  //                     - SECTION 1 -                       //
  12.  //          Actions to be performed on ALL ITEMS           //
  13.  //-----------------    Begin Editable    ------------------//
  14.  
  15.   $entry['modtime'] = filemtime($path);
  16.  
  17.  //-----------------     End Editable     ------------------//
  18.             do if (!is_dir($path)) {
  19.  //---------------------------------------------------------//
  20.  //                     - SECTION 2 -                       //
  21.  //         Actions to be performed on FILES ONLY           //
  22.  //-----------------    Begin Editable    ------------------//
  23.  
  24.  
  25.  
  26.  //-----------------     End Editable     ------------------//
  27.               break;
  28.             } else {
  29.  //---------------------------------------------------------//
  30.  //                     - SECTION 3 -                       //
  31.  //       Actions to be performed on DIRECTORIES ONLY       //
  32.  //-----------------    Begin Editable    ------------------//
  33.  
  34.  //-----------------     End Editable     ------------------//
  35.               break;
  36.             } while (FALSE);
  37.             $list[] = $entry;
  38.           }
  39.         }
  40.       }
  41.       closedir($handle);
  42.       return $list;
  43.     } else return FALSE;
  44.   }  
  45.  
  46.  
  47.  
  48.   $result = process_dir('img/');
  49.  
  50.  
  51. require ("zipfile.php");
  52.  
  53. $zipfile = new zipfile();
  54.  
  55.  
  56.  
  57.   foreach ($result as $file) {
  58.        $file_e= $file['dirpath'].$file['filename'] ;
  59.        if (is_dir($file_e)) {
  60.        $zipfile->add_dir($file_e);
  61.      //  echo "<b>Directorio: </b>";
  62.        } else {
  63. $zipfile->add_file(implode("",file($file_e)), $file_e);
  64.     //   echo "<b>Archivo: </b>";
  65.        }
  66.        echo $file_e;
  67.        echo "<br>";
  68.       }
  69.      
  70.  
  71. header("Content-type: application/octet-stream");
  72. header("Content-disposition: attachment; filename=fotos.zip");
  73. echo $zipfile->file();

Crea un zip con todo lo que hay en el directorio, en este caso img/, y te lo da a descargar.

El problema está en que no llega mas allá de un directorio.

Me explico mejor; comprime todos los archivos que haya e incluso los directorios que haya dentro de ese, pero... los directorios de dentro, lo que contengan no lo comprime.


Un ej para que se me entienda:

Tengo

1.php
2.php
img/
img/hola.php


El .zip solo contiene
1.php
2.php
img/


y no img/hola.php

Espero que puedan ayudarme
__________________
:)
  #17 (permalink)  
Antiguo 11/07/2011, 08:27
 
Fecha de Ingreso: noviembre-2010
Mensajes: 1.242
Antigüedad: 13 años, 5 meses
Puntos: 73
Respuesta: Problema con comprimir todo el directorio

Acabo de darme cuenta que es que la función process_dir no llega más de un directorio
__________________
:)
  #18 (permalink)  
Antiguo 11/07/2011, 08:51
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Comprimir directorio entero

En este artítulo, http://devzone.zend.com/article/2105 existe un buen material para que te puedas desenvolver, específicamente con
Código PHP:
Ver original
  1. <?PHP
  2. // increase script timeout value
  3. ini_set('max_execution_time', 300);
  4.  
  5. // create object
  6. $zip = new ZipArchive();
  7.  
  8. // open archive
  9. if ($zip->open('my-archive.zip', ZIPARCHIVE::CREATE) !== TRUE) {
  10.     die ("Could not open archive");
  11. }
  12.  
  13. // initialize an iterator
  14. // pass it the directory to be processed
  15. $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("app/"));
  16.  
  17. // iterate over the directory
  18. // add each file found to the archive
  19. foreach ($iterator as $key=>$value) {
  20.     $zip->addFile(realpath($key), $key) or die ("ERROR: Could not add file: $key");
  21. }
  22.  
  23. // close and save archive
  24. $zip->close();
  25. echo "Archive created successfully.";
Funciona perfecto.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #19 (permalink)  
Antiguo 11/07/2011, 08:54
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Comprimir directorio entero

Temas unidos, por favor NO dupliques temas.
  #20 (permalink)  
Antiguo 11/07/2011, 09:15
 
Fecha de Ingreso: noviembre-2010
Mensajes: 1.242
Antigüedad: 13 años, 5 meses
Puntos: 73
Respuesta: Comprimir directorio entero

Cita:
Iniciado por GatorV Ver Mensaje
Temas unidos, por favor NO dupliques temas.

Juraría que lo hice en uno nuevo... lo siento no se en que me equivoqué, pero la intención fue uno nuevo
__________________
:)
  #21 (permalink)  
Antiguo 11/07/2011, 09:25
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Comprimir directorio entero

¿No te funciona el ejemplo que te indiqué?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #22 (permalink)  
Antiguo 11/07/2011, 09:34
 
Fecha de Ingreso: noviembre-2010
Mensajes: 1.242
Antigüedad: 13 años, 5 meses
Puntos: 73
Respuesta: Comprimir directorio entero

Cita:
Iniciado por abimaelrc Ver Mensaje
¿No te funciona el ejemplo que te indiqué?
Estoy mirandolo, me lanza un error interno del servidor, antes de comentar, estaba mirando algunas clases que tu código lleva y no conozco como RecursiveDirectoryIterator

*Creo que me equivoqué al responder a GatorV, creí que decía que no uniese los dos y fue el el que los unió por que no quiere duplicados
__________________
:)
  #23 (permalink)  
Antiguo 11/07/2011, 09:45
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Comprimir directorio entero

Así es, no se permite duplicar temas en FdW, si ya tenías este abierto, por favor continua sobre este tema y evita una infracción.

Etiquetas: comprimir, directorio, entero, todo
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




La zona horaria es GMT -6. Ahora son las 19:27.