2012-03-23 31 views
5

Estoy intentando utilizar Node.js para crear un archivo zip de una carpeta existente, y preservar la estructura.Creación de un archivo zip desde una carpeta y la preservación de la estructura con Node.js

Tenía la esperanza de que habría un módulo simple para permitir este tipo de cosas:

archiver.create("../folder", function(zipFile){ 
    console.log('et viola'); 
}); 

pero no puedo encontrar nada de eso!

He estado buscando en Google alrededor, y el mejor que he encontrado hasta ahora es zipstream, pero en lo que puedo decir no hay manera de hacer lo que quiero. Realmente no quiero llamar a las utilidades de línea de comandos, ya que la aplicación tiene que ser multiplataforma.

Cualquier ayuda sería muy apreciada.

Gracias.

Respuesta

2

No es completamente libre de código, pero puede usar node-native-zip junto con folder.js. Uso:

function zipUpAFolder (dir, callback) { 
    var archive = new zip(); 

    // map all files in the approot thru this function 
    folder.mapAllFiles(dir, function (path, stats, callback) { 
     // prepare for the .addFiles function 
     callback({ 
      name: path.replace(dir, "").substr(1), 
      path: path 
     }); 
    }, function (err, data) { 
     if (err) return callback(err); 

     // add the files to the zip 
     archive.addFiles(data, function (err) { 
      if (err) return callback(err); 

      // write the zip file 
      fs.writeFile(dir + ".zip", archive.toBuffer(), function (err) { 
       if (err) return callback(err); 

       callback(null, dir + ".zip"); 
      });      
     }); 
    });  
} 
+0

Gracias mucho! Se crea el zip, pero desafortunadamente está dañado y parece estar vacío. Voy a jugar con eso e intentaré ver cuál es el problema. – user1257359

+0

En realidad, parece estar * ligeramente * corrupto;) Cuando intento explorar el archivo zip creado, aparece vacío, pero cuando lo extraigo, el contenido se ve bien. ¡Gracias por una respuesta genial y rápida! – user1257359

+0

¡Funciona como un encanto! – Tim

1

Esto se puede hacer incluso más simple utilizando la función incorporada de archivo exec. Genera un proceso y ejecuta el comando zip a través del sistema operativo, de forma nativa. Todo funciona.

var execFile = require('child_process').execFile; 

execFile('zip', ['-r', '-j', zipName, pathToFolder], function(err, stdout) { 
     console.log(err); 
     logZipFile(localPath); 
    }); 

La bandera -j 'juncos' la ruta del archivo, si está un sibdirectory pasar con velocidad, y no quiere anidamiento excesivo dentro del archivo zip.

Aquí es some documentation on execfile. Aquí está a man page for zip.

+0

La operación específicamente dijo que querían plataforma nativa y multiplataforma y NO una llamada de línea de comando. – JohnC

-1

Usando Easy-zip, npm install easy-zip, que puede hacer:

var zip5 = new EasyZip(); 
zip5.zipFolder('../easy-zip',function(){ 
    zip5.writeToFile('folderall.zip'); 
}); 
+1

No recomendaría usar esto debido a [este problema] (https://github.com/owenchong/easy-zip/issues/2). – rax

+0

He estado usando 'easy-zip' últimamente y no me he encontrado con el problema que @rax resaltó. – developius

Cuestiones relacionadas