Node.js - Zip/Unzip a folder

You can use the tar-stream module to create a tar archive. Its much more flexible and simpler than node-tar in that:

  • You can add files to the archive (not just directories, which is a limitation of node-tar)
  • It works with normal node filesystem streams (node-tar strangely requires the use of the fstream module)
  • Its pretty fully documented (node-tar isn't well documented)
  • You can create an archive without hitting the filesystem

Create the tar archive, then compress it using zlib, then write it wherever you want (network, filesystem, etc).


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.


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).

Tags:

Zlib

Node.Js