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.
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 .
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.
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).
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
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With