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:
Convert the folder into a
.tar
fileCompress 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 usingfs
? I don't know (please, comment if you have an idea).