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