Gestor ZIP con mis archivos locales y con trazado

Figura
Figura. Gestor ZIP con trazado

En la herramienta Web Tools online: ZIP se presenta una utilidad para usar el módulo zip.js cuyo cometido se explica en el tema Aplicación para descargar ZIP. En ese tema se explica como funciona el ZIP. Y en el tema siguiente Crear un ZIP se explica como se estructura un ZIP. Mientras que este tema se orienta a explicar como funciona la herramienta para crear y trazar el proceso de generación del ZIP.

Cuando implementamos una aplicación compleja, especialmente basada en especificaciones, considero aconsejable dotarla de los recursos necesarios para que nos devuelva una traza del proceso. Esto tiene varias ventajas. Por un lado vamos entendiendo mejor la especificación y podemos irla implementando en fases, desde lo más simple a los más complejo. Por otro lado se localizan mejor los errores. Podemos aplicar mejoras en el futuro, pues la traza nos ayudará a recordar como funcionaba el proceso. Y, finalmente, podemos compatirla en Internet para alguién que esté interesado en conocer el funcionamiento de ese proceso.

En la Figura puede ver una captura de la traza. Si el panel está visible se trazará el proceso. Por defecto está limitada a un tamaño máximo de 10000 bytes de contenido de archivos. Para estudiar una traza con objeto de entender el funcionamiento no es nesario tamaños de archivos muy grandes.

En el área de texto de Archivos se inserta en formato JSON los archivos a empaquetar en ZIP. Las rutas serán las claves de cada archivo. Debe contener obligatoriamente la propiedad content con el contenido del archivo. La fecha date es opcional. Cualesquiera otras propiedades serán ignoradas. Con el botón agregamos esos archivos de muestra que se muestran en la Figura. Con el botón agregamos los archivos desde el campo de rutas que habremos cargado desde nuestro ordenador.

Una vez creado el ZIP se guarda el buffer de su contenido y se vierte en el área de texto los 100 primeros bytes. Puede verse el resto pulsando el botón con tres puntos. Con el botón podremos descargar ese buffer. Y tras el buffer se expone la traza que se comenta con detalle en el tema Crear un ZIP.

La traza se separa por bloques Local File Headers, Central Directory y Ending. Se muestran en cada fila el nombre del campo y los bytes que se insertan en el ZIP. Se ubican en orden little endian. Por ejemplo la versión, cuyo valor decimal es 20, ocupa 2 bytes, por lo que su valor hexadecimal es 0x0014, insertándolo invirtiendo los bytes como 14 00. En la traza los bytes se separan por un espacio.

Agregando rutas para crear el ZIP

Figura
Figura. Agregando archivos para crear un ZIP

Para agregar archivos podemos usar el campo de rutas arrastrando archivos y carpetas hasta ese campo. Por cada carpeta arrastrada se extraerán todos sus archivos, rellenándose automáticamente la lista de archivos. Puede vaciar esa lista y usar el botón Explorar para localizar los archivos que quiera incluir. Como se observa en la Figura, puede seleccionar una carpeta y usar la opción de menú Listar rutas, seleccionándose todos los archivos de esa carpeta.

Los archivos sueltos que se arrastren hasta el campo de rutas se ubicarán en una carpeta root. Al crear y descargar el ZIP aparecerá la ruta iniciándose con root/...

También puede usar el botón para cargar un Sistema de archivos en la pestaña Configuración del INICIO del marco de herramientas. Y a continuación ir a la aplicación para seleccionar los archivos que desee usando el botón Explorar.

Agregando opciones para crear el ZIP

Figura
Figura. Agregando opciones al crear un ZIP

Abriendo el panel de opciones podemos agregarlas usando el botón . Con el botón actualizamos las rutas en el desplegable, pues las opciones pueden aplicarse a todos los archivos con la clave "*" o bien a cada archivo individualmente.

Las opciones marcadas con (★) están soportadas en la herramienta. Las que no se soporten serán ignoradas al crear el ZIP. No cursarán error, aplicándose el valor por defecto de esa opción en caso de que no se soporte.

En el tema Crear ZIP nos extendemos más a fondo explicando las opciones. Aquí sólo las resumiremos:

  • Encrypted: Cifrado (Flag 0)
  • Implode: Opciones adicionales al método compresión Implode (Flags 1 y 2)
  • Deflate: Opciones adicionales al método compresión Deflate (Flags 1 y 2)
  • LZMA: Opciones adicionales al método compresión LZMA (Flags 1 y 2)
  • (★) Data Descriptor: Especificar los campos de CRC y tamaños después de los datos (Flag 3)
  • Enhanced Deflating: Método Deflate mejorado (Flag 4)
  • Patched: Parcheado (Flag 5)
  • Strong Encryption: Cifrado fuerte (Flag 6)
  • (★) UTF8: Especificar UTF8 para nombres y comentarios de archivos (Flag 11)
  • Encrypting Directory: Cifrar directorio central (Flag 13)
  • (★) Internal Attribute ASCII: Indicar que los archivos son texto ASCII
  • (★) External Attributes: Atributos dependientes del sistema
  • (★) Compression Method: Métodos de compresión, sólo se soporta por ahora Stored
  • (★) Allow Signatures In Comments: Permitir signaturas en comentarios
  • (★) File Comment: Comentario de archivo
  • (★) Zip Comment: Comentario del ZIP
  • (★) Zip Lang: Idioma para crear el ZIP
  • (★) Zip Factor: Factor de tamaño para crear el ZIP

Limitación de tamaño al crear ZIP

Figura
Figura. Descargando ZIP de 1,15 GB

La estructura del ZIP dispone el tamaño en los campos Compressed size y Uncompressed size que ocupan 4 bytes. Eso significa que el tamaño máximo posible es 232-1 = 4,294967295 GB. A partir de 2 GB he comprobado que en Chrome 89 se queda sin memoria para alojar el buffer. Por eso he limitado el tamaño a 231-1 = 2,147483647 GB, lo que supone la mitad del tamaño máximo.

En la Figura puede ver la creación de un ZIP con un único archivo de 1,15 GB. Tarda 6,352 segundos leyendo el archivo y 26,155 segundos creando el ZIP. Por lo tanto crear un ZIP con archivos de gran tamaño no es aconsejable en este aplicación, al menos tal y como está diseñada por el momento.

Figura
Figura. Descargando ZIP con 3142 archivos

Mi propósito es descargar tamaños en el orden de cientos de MB y con un gran número de archivos, como el de la Figura, archivos que son generalmente de tamaño reducido. Son 3142 archivos que ocupan en ZIP poco más de 64 MB. Tarda 1,847 segundos leyendo archivos y 0,444 segundos construyendo el ZIP, tiempos asumibles. El objetivo es descargar archivos de desarrollo web, como HTML, CSS, JS e imágenes, que en la mayor parte de los casos serán muchos archivos de tamaño pequeño.

Para ese objetivo esta herramienta es más que apropiada, teniendo en cuenta que con el ZIP evitamos los inconvenientes de las descargas múltiples, las barras derechas en las rutas y los avisos de descargas de archivos JavaScript, tal como expuse en el tema necesidad de las descargas en ZIP.

Figura
Figura. Descargando múltiples archivos

En la Figura se observa el momento de descargar cuatro archivos HTML que han sido minimizados con la herramienta Minimizador. Se descargarán en un ZIP manteniendo las rutas originales, los que nos permitirá extraerlos a las mismas carpetas del ordenador.

Opciones de la aplicación

Figura
Figura. Opciones de la aplicación

Existen otras opciones que podemos configurar para la ejecución de la aplicación. Un campo de Idioma nos permite elegir entre español (es) e inglés (en) como idioma de la interfaz. Este campo es independiente del idioma que usaremos para crear el ZIP y que explicamos anteriormente.

El campo Máximo bytes trazado especifica el número máximo de bytes permitidos para ejecutar el trazado del proceso. Si este valor es muy grande podría colapsar la aplicación. Se inicia con el valor 10000 bytes.

Campo Advertir tamaño: Si se activa nos advertirá con un mensaje cuando el tamaño del total de archivos a empaquetar en ZIP supere el valor del campo Tamaño Advertencia (MB).

Campo Tamaño advertencia (MB): Tamaño total de los archivos a empaquetar para advertir mediante un mensaje, pudiendo aceptarlo o cancelarlo. Su valor inicial es 100 MB.

Campo Procesar por lotes: Si el tamaño del total de archivos a empaquetar en ZIP es muy grande, cabe la posibilidad de dividir el proceso en lotes, cuyos tamaños se indican en el campo Tamaño lote. Por cada lote ejecutado se descargará un ZIP.

Campo Tamaño lote (MB): El tamaño del lote en MB a procesar y descargar en un ZIP. Por ejemplo, si el tamaño total es de 1000 MB y especificamos lotes de 100 MB, se descargarán 10 archivos ZIP. Su valor inicial es de 25 MB.

Este campo de procesar por lotes es incompatible con el de intervalos que veremos a continuación. La aplicación permite marcar uno u otro o ninguno, pero no ambos a la vez.

Figura
Figura. Cancelando proceso creación ZIP

Campo Usar intervalos: La creación del ZIP tiene dos partes. En la primera se procede a leer todos los archivos a empaquetar. Si se activa el uso de intervalos, se mostrará el progreso del proceso de lectura de archivos en intervalos de número de archivos indicado en el campo Intervalo Ejecución. El mínimo de archivos en cada intervalo son 10.

Aparte de ir observando el progreso de lectura de archivos y lo que aún falta por leer, otra ventaja adicional es que podemos parar la ejecución. En la Figura se observa la cancelación de un proceso de 12466 archivos antes de iniciar la lectura del archivo número 1701. Si no se usa intervalos la ejecución no podrá ser detenida.

Campo Intervalo ejecución: Número de archivos entre dos actualizaciones del marcador de progreso de la ejecución, donde se indica que número de archivo se está procesando, siendo este número el primero de cada intervalo. Su valor inicial es de 100 archivos.