2013-03-20 2 views
16

Mi sto tuffando in Zlib di node.js. Sono stato in grado di comprimere e decomprimere i file utilizzando gli esempi forniti (http://nodejs.org/api/zlib.html#zlib_examples) ma non sono riuscito a trovare ulteriori informazioni su come fare lo stesso per le cartelle?Node.js - Zip/decomprimere una cartella

Una possibilità (ma che considero armeggiare) è quella di utilizzare il modulo node-zip e aggiungere uno alla volta tutti i file della cartella. Ma dovrò affrontare un problema quando non compresso (perderò le cartelle in questo caso).

Qualche idea su come comprimere (e quindi decomprimere) un'intera cartella (rispettando la gerarchia dei sub-solder) utilizzando Node.js?

Grazie.

+1

Zlib è solo una compressione, si desidera tar una cartella, quindi comprimila, l'intera cosa tar.gz, prova https://github.com/isaacs/node-tar – generalhenry

+0

Oh, ho capito! Quindi, ho bisogno di farlo in due passi: 1/Convertire la cartella in un file '.tar', quindi 2/Comprimi il file' .tar' in '.tar.gz' usando Zlib. Il modulo 'node-tar' non è molto ben documentato, hai risorse aggiuntive? – htaidirt

+1

Ho dato un'occhiata, il migliore che ho trovato è https://github.com/cthackers/adm-zip – generalhenry

risposta

25

ho finalmente capito, con l'aiuto di @generalhenry (vedi commenti sulla questione) e

come accennato nei commenti, abbiamo bisogno di comprimere la cartella in due fasi:

  1. Converti la cartella in un file .tar

  2. comprimere il file .tar

Al fine di eseguire il primo passo, avevo bisogno di due moduli: Node.JS

npm install tar 
npm install fstream 

Il primo ci permette di creare file .tar. Puoi avere accesso al codice sorgente qui https://github.com/isaacs/node-tar

Il secondo modulo di nodo ci aiuterà a leggere una cartella e scrivere un file. Riguardo al modulo base fs node.js, non so se sia possibile leggere una directory (non sto parlando di ottenere tutti i file in un array, usando fs.readdir, ma gestendo tutti i file e la loro organizzazione in cartelle).

Quindi, quando converto la cartella nel file .tar, posso comprimerla utilizzando Gzip() di Zlib.

Ecco il codice finale:

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 */ 

Questo mi ha aiutato a comprimere un'intera cartella utilizzando node.js

più 2 attività:

  • Come si può vedere, ci è una mancanza di documentazione sul modulo tar. Spero che questo sarà migliorato presto poiché i due esempi che sono stati forniti parlano di come estrarre il contenuto dal file .tar.

  • Ho utilizzato il modulo fstream per aiutarmi a gestire la directory di origine. Questo può essere bypassato usando fs? Non lo so (per favore, commenta se hai un'idea).

3

È possibile utilizzare il modulo tar-stream per creare un archivio tar.La sua molto più flessibile e più semplice di nodo-tar in quanto:

  • è possibile aggiungere file all'archivio (non solo le directory, che è una limitazione di nodo-tar)
  • Funziona con normali flussi nodo del filesystem (nodo-tar richiede stranamente l'uso del modulo fstream)
  • sua piuttosto completamente documentato (node-tar non è ben documentata)
  • è possibile creare un archivio senza colpire il filesystem

creare il catrame archivia, quindi comprimilo usando zlib, quindi scrivilo dove vuoi (rete, filesystem, ecc.).

+0

Puoi fornire la documentazione di dove tar-stream dice/mostra che può utilizzare i flussi del file system ('fs'). Non riesco a trovarlo. –

+0

A questo punto sono molto fuori allenamento con questo modulo. Forse questo ti sarà d'aiuto? https://github.com/mafintosh/tar-stream/issues/8 –