Working with ZIP files in LuaRT
Tags: lua, windows, tutorial
Published: 2021-09-28 17:09:06

[LuaRT](https://www.luart.org) provides a builtin `compression` module to work with compressed files in ZIP format, without any additional dependencies.


##ZIP archive files
ZIP is a file format that supports lossless compression. A lossless compression algorithm allows the original data to be perfectly reconstructed from the compressed data. A ZIP file contains one or more compressed files, making it an ideal way to reduce the size of large files and keep related files together.
 
 
##The Zip Object
The LuaRT `compression` module provides an abstraction of zip files represented as a `Zip` Object. Only INFLATE/DEFLATE algorithms are supported.
This Object facilitates the creation of ZIP archive files and provides methods and properties for adding and extracting compressed files.

To use the `Zip` Object, you must first require for the `compression` module :

```lua
-- require the builtin 'compression' module
local compression = require "compression"
``` 
 
 
##Extract files from a ZIP archive
To extract files from an existing ZIP archive, you can use the `Zip:extractall()` method :

```lua
local compression = require "compression"

-- Create a Zip instance to represent the ZIP file 'archive.zip'
local archive = compression.Zip("archive.zip")

-- open the ZIP archive for reading
archive:open("read")

-- extract and uncompress all the files in the current directory
archive:extractall()
```

You can extract a specific entry with the `Zip:extract()` method :

```lua
-- extract the ZIP entry "extractme.bin" in the current directory 
archive:extract("extractme.bin")
```
 
A destination path can optionaly be provided :

```lua
-- extract the ZIP entry "data.bin" in the specified directory 
archive:extract("data.bin", "C:\\Extract\\Me\\Here")
```
 
 
##Creating a ZIP archive
`Zip:open()` can be used to create an empty ZIP archive. Files can be added to the archive with the `Zip:write()` method:

```lua
local compression = require "compression"

-- Create a Zip value to represent the ZIP file 'new.zip'
local archive = compression.Zip("new.zip")

-- open the ZIP archive for writing
archive:open("write")

-- add a file to this archive
archive:write("C:\\addme.txt"))
```

You can recursively add entire directories too :

```lua
archive:write("C:\\I_am_a_directory_addme\\"))
```
 
 
##Iterating over files in a ZIP archive
`Zip` object is iterable with the `each()` function, returning at every iteration the next entry name in the ZIP archive previously opened in "read" mode:

```lua
local compmression = require "compression"

-- Create a Zip value to represent the ZIP file 'archive.zip'
local archive= compression.Zip("archive.zip")

-- open the ZIP archive for reading
archive:open("read")

-- Iterate over each ZIP archive entries and extract it
for entry in each(archive) do
   print("Extracting '"..entry.."'")
   archive:extract(entry)
end
```
 

##Reading ZIP archive entries in memory
ZIP archive entries can also be extracted in-memory using the `Zip:read()` method :

```lua
local compression = require "compression"

-- Create a Zip value to represent the ZIP file 'archive.zip'
local archive = compression.Zip("archive.zip")

-- open the ZIP archive for reading
archive:open("read")

-- print the content of the ZIP archive entry 'README.TXT'
print(archive:read("README.TXT"))
```
 
 
As you can see, LuaRT's `compression` module provides an easy way to manage ZIP archives. Additionally, you can read the complete [compression module](https://www.luart.org/doc/compression/index.html) module documentation.