Clone this repo:


  1. f44494a Merge pull request #243 from jhudsonWA/master by Nathan Moinvaziri · 4 days ago master
  2. 7c5ccae Fixed formatting. by Nathan Moinvaziri · 4 days ago
  3. 82df346 Update mz_strm_crypt.c by Joshua Hudson · 4 days ago
  4. db8158a Merge pull request #242 from juanii/master by Nathan Moinvaziri · 11 days ago
  5. 6209096 Removed unnecessary assignment to size_comment. by juanii · 11 days ago

Minizip 2.2.7

This library is a refactoring of the minizip contribution found in the zlib distribution that is supported on Windows, macOS, and Linux. The motivation for this work has been the inclusion of advanced features, improvements in code maintainability and readability, and the reduction of duplicate code. It is based on the original work of Gilles Vollant that has been contributed to by many people over the years.

Dev: Dev Branch Status Master: Master Branch Status

For my older fork of this library checkout the 1.2 branch. For the original work maintained by Mark Adler checkout the zlib minizip contrib.


To generate the project files for your platform and IDE download and run cmake in the project directory.

cmake .
cmake --build .


| File(s) | Description | Required | |:- |:-|:-:| | minizip.c | Sample application | No | | mz_compat.* | Minizip 1.0 compatibility layer | No | | mz.h | Error codes and flags | Yes | | mz_os* | OS specific helper functions | Encryption, Disk Splitting | | mz_strm.* | Stream interface | Yes | | mz_strm_aes.* | WinZIP AES stream | No | | mz_strm_buf.* | Buffered stream | No | | mz_strm_bzip.* | BZIP2 stream using libbzip2 | No | | mz_strm_crypt.* | PKWARE traditional encryption stream | No | | mz_strm_lzma.* | LZMA stream using liblzma | No | | mz_strm_mem.* | Memory stream | Yes | | mz_strm_split.* | Disk splitting stream | No | | mz_strm_posix.* | File stream using Posix functions | Non-windows systems | | mz_strm_win32.* | File stream using Win32 API functions | Windows systems | | mz_strm_zlib.* | Deflate stream using zlib | Yes | | mz_zip.* | Zip functionality | Yes |


Compression Methods


  • Requires cmake . -DUSE_BZIP2=ON or #define HAVE_BZIP2
  • Requires BZIP2 library


  • Requires cmake . -DUSE_LZMA=ON or #define HAVE_LZMA
  • Requires liblzma library


WinZIP AES Encryption

  • Requires cmake . -DUSE_AES=ON or #define HAVE_AES
  • Requires Brian Gladman's AES and SHA libraries

When zipping with a password it will always use AES 256-bit encryption. When unzipping it will use AES decryption only if necessary.

Disabling All Encryption

To disable encryption use the following cmake commands:

cmake . -DUSE_AES=OFF

NTFS Timestamps

Support has been added for UTC last modified, last accessed, and creation dates.


This library has been refactored around streams.

Memory Streaming

To unzip from a zip file in memory create a memory stream and pass it to the unzip open functions.

uint8_t *zip_buffer = NULL;
int32_t zip_buffer_size = 0;
void *mem_stream = NULL;

// fill zip_buffer with zip contents
mz_stream_mem_set_buffer(mem_stream, zip_buffer, zip_buffer_size);
mz_stream_open(mem_stream, NULL, MZ_OPEN_MODE_READ);

void *zip_handle = mz_zip_open(mem_stream, MZ_OPEN_MODE_READ);
// do unzip operations


To create a zip file in memory first create a growable memory stream and pass it to the zip open functions.

void *mem_stream = NULL;

mz_stream_mem_set_grow_size(mem_stream, (128 * 1024));
mz_stream_open(mem_stream, NULL, MZ_OPEN_MODE_CREATE);

void *zip_handle = mz_zip_open(mem_stream, MZ_OPEN_MODE_WRITE);
// do unzip operations


For a complete example, see test_zip_mem() in test.c.

Buffered Streaming

By default the library will read bytes typically one at a time. The buffered stream allows for buffered read and write operations to improve I/O performance.

void *stream = NULL;
void *buf_stream = NULL;

// do open os stream

mz_stream_buffered_open(buf_stream, NULL, MZ_OPEN_MODE_READ);
mz_stream_buffered_set_base(buf_stream, stream);

void *zip_handle = mz_zip_open(buf_stream, MZ_OPEN_MODE_READ);

Disk Splitting Stream

To create an archive with multiple disks use the disk splitting stream and for zipping supply a disk size value in bytes.

void *stream = NULL;
void *split_stream = NULL;


mz_stream_split_set_prop_int64(split_stream, MZ_STREAM_PROP_DISK_SIZE, 64 * 1024);

mz_stream_set_base(split_stream, stream);

mz_stream_open(split_stream, path..

handle = mz_zip_open(split_stream, MZ_OPEN_MODE_WRITE);

The central directory is the only data stored in the .zip and doesn't follow disk size restrictions.

When unzipping it will automatically determine when in needs to cross disk boundaries.

Windows RT

  • Requires #define MZ_USE_WINRT_API


  • Archives are required to have a central directory.
  • Central directory header values should be correct and it is necessary for the compressed size to be accurate for AES encryption.
  • Central directory encryption is not supported due to licensing restrictions mentioned by PKWARE in their zip appnote.