2013-03-26 11 views
45

Ho bisogno di comprimere un'intera directory utilizzando Node.js. Attualmente sto usando node-zip e ogni volta che il processo viene eseguito genera un file ZIP non valido (come puoi vedere da this Github issue).È necessario comprimere un'intera directory utilizzando Node.js

C'è un'altra, migliore, opzione Node.js che mi permetterà di inserire una directory in ZIP?

EDIT: ho finito per usare archiver

writeZip = function(dir,name) { 
var zip = new JSZip(), 
    code = zip.folder(dir), 
    output = zip.generate(), 
    filename = ['jsd-',name,'.zip'].join(''); 

fs.writeFileSync(baseDir + filename, output); 
console.log('creating ' + filename); 
}; 

valore di esempio per i parametri:

dir = /tmp/jsd-<randomstring>/ 
name = <randomstring> 

UPDATE: Per coloro che chiedono la realizzazione ho usato, here's a link to my downloader:

+0

Buona chiamata @booyaa. Grazie. – commadelimited

+3

Qualcuno su Twitter ha suggerito l'API child_process e chiama semplicemente il sistema ZIP: http://nodejs.org/api/child_process.html – commadelimited

+1

Ho provato l'approccio child_process. Ha due caveat. ** 1) ** il comando unix 'zip' include tutta la gerarchia di cartelle madri della directory di lavoro corrente nel file zippato. Questo potrebbe andar bene per te, non era per me. Anche modificare la directory di lavoro corrente in child_process in qualche modo non influisce sui risultati. ** 2) ** Per ovviare a questo problema, devi usare 'pushd' per saltare nella cartella zip e' zip -r', ma dato che 'pushd' è incorporato in bash e non in/bin/sh devi anche usare/bin/bash. Nel mio caso specifico ciò non era possibile. Solo un avviso. – johnozbay

risposta

71

Ho finito per utilizzare archiver lib. Funziona alla grande.

Example

var file_system = require('fs'); 
var archiver = require('archiver'); 

var output = file_system.createWriteStream('target.zip'); 
var archive = archiver('zip'); 

output.on('close', function() { 
    console.log(archive.pointer() + ' total bytes'); 
    console.log('archiver has been finalized and the output file descriptor has closed.'); 
}); 

archive.on('error', function(err){ 
    throw err; 
}); 

archive.pipe(output); 
archive.bulk([ 
    { expand: true, cwd: 'source', src: ['**'], dest: 'source'} 
]); 
archive.finalize(); 
+1

Non sembrano esserci esempi su come farlo, ti dispiace condividere ciò che hai fatto? – Sinetheta

+3

Sicuro. Aggiornerò il post originale L'archiviatore – commadelimited

+1

, sfortunatamente, non supporta i caratteri Unicode nei nomi dei file fin d'ora. Segnalato a https://github.com/ctalkington/node-archiver/issues/90. – Eye

3

Adm -zip ha problemi solo comprimendo un archivio esistente https://github.com/cthackers/adm-zip/issues/64 così come cor ruzione con compressione di file binari.

Ho anche imbattuto in problemi di corruzione di compressione con il nodo-zip https://github.com/daraosn/node-zip/issues/4

nodo-Archiver è l'unico che sembra funzionare bene per comprimere, ma non ha alcuna funzionalità di decompressione.

+1

Informazioni su quale nodo-archivista stai parlando? : github.com/archiverjs/node-archiver; github.com/richardbolt/node-archiver – biphobe

+0

@firian Non ha detto Archiver, ha detto Adm-zip. –

+5

@FrancisPelland Umm, nell'ultima frase ha scritto "_node-archiver è l'unico che sembra funzionare_" - questo è ciò a cui mi riferisco. – biphobe

10

per includere tutti i file e le directory:

archive.bulk([ 
    { 
    expand: true, 
    cwd: "temp/freewheel-bvi-120", 
    src: ["**/*"], 
    dot: true 
    } 
]); 

Esso utilizza nodo-glob (https://github.com/isaacs/node-glob) sotto, in modo che qualsiasi espressione corrispondente compatibile con che funzionerà.

2

Per pipe il risultato per l'oggetto Response (scenari in cui v'è la necessità di scaricare lo zip, piuttosto che memorizzare in locale)

archive.pipe(res); 

suggerimenti di Sam per l'accesso al contenuto della directory lavorato per me.

src: ["**/*"] 
7

Archive.bulk è ora deprecato, il nuovo metodo da utilizzare per questo è glob:

var fileName = 'zipOutput.zip' 
var fileOutput = fs.createWriteStream(fileName); 

fileOutput.on('close', function() { 
    console.log(archive.pointer() + ' total bytes'); 
    console.log('archiver has been finalized and the output file descriptor has closed.'); 
}); 

archive.pipe(fileOutput); 
archive.glob("../dist/**/*"); //some glob pattern here 
archive.glob("../dist/.htaccess"); //another glob pattern 
// add as many as you like 
archive.on('error', function(err){ 
    throw err; 
}); 
archive.finalize(); 
+2

Ci stavamo chiedendo, hanno detto che bulk era deprecato ma non ha suggerito quale funzione utilizzare. –

Problemi correlati