Creating your first CAB file

Purpose

This guide walks you through creating a CAB archive from scratch. You’ll learn how to bundle multiple files into a compressed CAB file using different compression algorithms.

Concepts

Creating a CAB archive involves:

  1. Source Files: The files you want to archive

  2. Compression Algorithm: How to compress the data (MSZIP, LZX, etc.)

  3. Cabinet Structure: How files are organized into folders

  4. Output File: The resulting .cab file

Prerequisites

  • Cabriolet installed (see Installation)

  • Some files to archive (text, images, executables, etc.)

Step 1: Prepare Your Files

Create a directory with files to archive:

mkdir my-project
cd my-project
echo "Hello, CAB!" > readme.txt
echo "Version 1.0" > version.txt
mkdir data
echo "Configuration" > data/config.ini

You should now have:

my-project/
  readme.txt
  version.txt
  data/
    config.ini

Step 2: Create a Basic CAB

Create a CAB file with default settings (MSZIP compression):

cabriolet create my-archive.cab readme.txt version.txt data/config.ini
Example Output
Creating my-archive.cab...
  Adding readme.txt (13 bytes)
  Adding version.txt (12 bytes)
  Adding data/config.ini (13 bytes)

Successfully created my-archive.cab (3 files, 38 bytes → 124 bytes total)
Compression ratio: 30.6%
The create command is planned but not yet fully implemented. The examples below show the intended functionality.

Step 3: Verify Your CAB

List the contents to verify:

cabriolet list my-archive.cab
Example Output
Files in my-archive.cab:
  readme.txt (13 bytes)
  version.txt (12 bytes)
  data/config.ini (13 bytes)

Total: 3 files, 38 bytes
Compression: MSZIP

Step 4: Choose Compression Algorithm

Create CABs with different compression algorithms:

MSZIP (Default - ZIP/Deflate Compatible)

cabriolet create --compression=mszip my-archive-mszip.cab *.txt

Best for:

  • General-purpose compression

  • Compatibility with ZIP tools

  • Moderate compression ratio

LZX (High Compression)

cabriolet create --compression=lzx my-archive-lzx.cab *.txt

Best for:

  • Maximum compression ratio

  • Large files

  • Software distribution

None (Uncompressed)

cabriolet create --compression=none my-archive-uncompressed.cab *.txt

Best for:

  • Already compressed files (images, videos)

  • Fast extraction needed

  • Testing purposes

Step 5: Add Directory Recursively

Include all files from a directory:

# Recursively add all files
cabriolet create my-project.cab my-project/

Or specify patterns:

# Add all .txt files
cabriolet create docs.cab **/*.txt

# Add multiple patterns
cabriolet create sources.cab **/*.rb **/*.md

Common Scenarios

Creating a Software Installer

Bundle program files:

cabriolet create --compression=lzx installer.cab \
  bin/program.exe \
  lib/*.dll \
  docs/readme.txt \
  data/config.xml

Creating a Documentation Archive

Archive documentation with moderate compression:

cabriolet create --compression=mszip docs.cab \
  README.md \
  LICENSE \
  docs/**/*.md

Creating a Backup

Uncompressed for speed:

cabriolet create --compression=none backup.cab important-files/

Using the Ruby API

Create CAB files programmatically:

Basic CAB creation
require 'cabriolet'

# Create a new CAB with files
compressor = Cabriolet::CAB::Compressor.new
compressor.add_file('readme.txt')
compressor.add_file('version.txt')
compressor.write('my-archive.cab')
With specific compression
require 'cabriolet'

# Create with LZX compression
compressor = Cabriolet::CAB::Compressor.new(compression: :lzx)
compressor.add_file('large-file.dat')
compressor.write('compressed.cab')
Add directory recursively
require 'cabriolet'

compressor = Cabriolet::CAB::Compressor.new
Dir.glob('project/**/*').each do |file|
  compressor.add_file(file) if File.file?(file)
end
compressor.write('project.cab')

For complete API documentation, see API Reference.

Advanced Options

Multi-part CABs

Create split archives for large files (planned feature):

# Split into 1MB parts
cabriolet create --split=1M large-archive.cab big-files/

This creates:

  • large-archive.cab (part 1)

  • large-archive.ca2 (part 2)

  • large-archive.ca3 (part 3)

  • etc.

Reserve Space

Reserve header space for digital signatures (planned):

cabriolet create --reserve=6144 signed.cab files/

Set Cabinet ID

Set a specific cabinet set ID:

cabriolet create --set-id=12345 numbered.cab files/

Compression Comparison

Test different algorithms on your data:

# Create with each algorithm
cabriolet create --compression=none uncompressed.cab data/
cabriolet create --compression=mszip mszip.cab data/
cabriolet create --compression=lzx lzx.cab data/

# Compare sizes
ls -lh *.cab
Table 1. Example Results
Algorithm Size Compression Ratio

None

1.2 MB

0% (original)

MSZIP

450 KB

62.5%

LZX

380 KB

68.3%

For detailed comparison, see Format Comparison.

Troubleshooting

"File not found" Error

Ensure all file paths are correct:

ls -la file.txt

"Cannot create output file" Error

Check:

  • Write permissions in output directory

  • Sufficient disk space

  • Output path is valid

Large Files Take Long Time

This is expected for LZX compression. Consider:

  • Using MSZIP for faster compression

  • Using --verbose to see progress

  • Splitting into multiple CABs

Best practices

  1. Choose appropriate compression:

    • MSZIP for general use

    • LZX for distribution

    • None for pre-compressed files

  2. Test your archives:

    cabriolet test my-archive.cab
  3. Keep source files: Don’t delete originals until verified

  4. Document contents: Include a readme in the CAB

  5. Version your CABs: Use descriptive names with versions

    cabriolet create myapp-v1.0.cab src/

Next steps

Now that you can create CAB files: