Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node.js - Zip/Unzip a folder

Tags:

node.js

zlib

I'm diving into Zlib of node.js. I was able to compress and uncompress files using the provided examples (http://nodejs.org/api/zlib.html#zlib_examples) but I didn't be able to find more about doing the same for folders?

One possibility (but that I consider as tinkering) is to use node-zip module and adding all the files of the folder one by one. But I'll face a problem when uncompressing (I will lose the folders in this case).

Any idea how to compress (and then uncompress) a whole folder (respecting the sub-solders hierarchy) using Node.js?

Thanks.

like image 479
htaidirt Avatar asked Mar 20 '13 17:03

htaidirt


People also ask

How do I read a zip file in node JS?

In Node. js, you can use the adm-zip module to create and read ZIP archives. In this tutorial, you will use adm-zip module to compress, read, and decompress files. First, you'll combine multiple files into a ZIP archive using adm-zip .

Which node module is used for zip and unzip functionalities?

ADM-ZIP is a pure JavaScript implementation for zip data compression for NodeJS. The library allows you to: decompress zip files directly to disk or in-memory buffers.


2 Answers

I've finally got it, with the help of @generalhenry (see comments on the question) and

as mentioned in the comments, we need to compress the folder in two steps:

  1. Convert the folder into a .tar file

  2. Compress the .tar file

In order to perform the first step, I needed two node.js modules:

npm install tar npm install fstream 

The first one allows us to create .tar files. You can have access to the source code here https://github.com/isaacs/node-tar

The second node module will help us to read a folder and write a file. Concerning the basic fs node.js module, I don't know if it is possible to read a directory (I'm not talking about getting all the files in an array, using fs.readdir, but handling all the files and their organization in folders).

Then, when I convert the folder to .tar file, I can compress it using Gzip() of Zlib.

Here is the final code:

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

This helped me to compress an entire folder using node.js

2 more things:

  • As you can see, there is a lack of documentation on tar module. I hope this will be improved soon since the two examples that was provided talk about how to extract content from the .tar file.

  • I used the fstream module to help me handle the source directory. Can this be bypassed using fs? I don't know (please, comment if you have an idea).

like image 80
htaidirt Avatar answered Sep 23 '22 14:09

htaidirt


Providing an updated answer as package tar has been updated since 2013.

To achieve the same result, the code is much simpler and straightforward:

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 need to explicitly use zlib.

like image 28
Andry Avatar answered Sep 23 '22 14:09

Andry