Saltar al contenido

Node.js – Comprimir/Descomprimir una carpeta

Esta es la solución más válida que encomtrarás compartir, pero primero obsérvala detenidamente y valora si se puede adaptar a tu proyecto.

Solución:

Finalmente lo tengo, con la ayuda de @generalhenry (ver comentarios sobre la pregunta) y

como se menciona en los comentarios, necesitamos comprimir la carpeta en dos pasos:

  1. Convierte la carpeta en un .tar expediente

  2. Comprimir el .tar expediente

Para realizar el primer paso, necesitaba dos módulos node.js:

npm install tar
npm install fstream

El primero nos permite crear .tar archivos Puede tener acceso al código fuente aquí https://github.com/isaacs/node-tar

El segundo módulo de nodos nos ayudará a leer una carpeta y escribir un archivo. En cuanto a lo básico fs módulo node.js, no sé si es posible leer un directorio (no estoy hablando de obtener todos los archivos en un arrayusando fs.readdirpero manejando todos los archivos y su organización en carpetas).

Luego, cuando convierto la carpeta a .tar archivo, puedo comprimirlo usando Gzip() de Zlib.

Aquí está el código final:

var fstream = require('fstream'),
    tar = require('tar'),
    zlib = require('zlib');

fstream.Reader( 'path': 'path/to/my/dir/', 'type': 'Directory' ) /* Read the source directory */
.pipe(tar.Pack()) /* Convert the directory to a .tar file */
.pipe(zlib.Gzip()) /* Compress the .tar file */
.pipe(fstream.Writer( 'path': 'compressed_folder.tar.gz' )); /* Give the output file name */

Esto me ayudó a comprimir una carpeta completa usando node.js

2 cosas más:

  • Como puede ver, hay una falta de documentación sobre tar módulo. Espero que esto mejore pronto, ya que los dos ejemplos que se proporcionaron hablan sobre cómo extraer contenido del .tar expediente.

  • usé el fstream módulo para ayudarme a manejar el directorio fuente. ¿Se puede omitir esto usando fs? No sé (por favor, comenta si tienes una idea).

Proporcionar una respuesta actualizada ya que el paquete tar se ha actualizado desde 2013.

Para lograr el mismo resultado, el código es mucho más simple y directo:

const tar = require("tar"); // version ^6.0.1
const fs = require("fs");

tar.c(
  
    gzip: true // this will perform the compression too
  ,
  ["path/to/my/dir/"]
).pipe(fs.createWriteStream('path/to/my/dir.tgz'));

No es necesario usar explícitamente zlib.

Puede usar el módulo tar-stream para crear un archivo tar. Es mucho más flexible y simple que node-tar en eso:

  • Puede agregar archivos al archivo (no solo directorios, que es una limitación de node-tar)
  • Funciona con flujos de sistema de archivos de nodo normales (node-tar extrañamente requiere el uso del módulo fstream)
  • Está bastante completamente documentado (node-tar no está bien documentado)
  • Puede crear un archivo sin tocar el sistema de archivos

Cree el archivo tar, luego comprímalo usando zlib, luego escríbalo donde quiera (red, sistema de archivos, etc.).

valoraciones y reseñas

Si te ha sido de provecho este post, nos gustaría que lo compartas con más programadores así contrubuyes a dar difusión a este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *