Extracting Files Guide

Purpose

Learn how to extract files from all supported archive formats using Cabriolet.

Concepts

Extraction decompresses and saves files from archives to disk. Different formats require different commands but follow similar patterns.

By Format

CAB files

# Extract all files
cabriolet extract archive.cab

# Extract to specific directory
cabriolet extract archive.cab output/

# Verbose output
cabriolet extract --verbose archive.cab

Ruby API:

decompressor = Cabriolet::CAB::Decompressor.new
cabinet = decompressor.open('archive.cab')
decompressor.extract_all(cabinet, 'output/')

CHM files

cabriolet chm-extract help.chm output/

Ruby API:

decompressor = Cabriolet::CHM::Decompressor.new
chm = decompressor.open('help.chm')

chm.all_files.each do |file|
  next if file.system_file?
  decompressor.extract(file, "output/#{file.filename}")
end

SZDD files

# Auto-detect output name
cabriolet expand file.tx_

# Specify output
cabriolet expand file.tx_ file.txt

Ruby API:

decompressor = Cabriolet::SZDD::Decompressor.new
header = decompressor.open('file.tx_')
decompressor.extract(header, 'file.txt')

KWAJ Files

cabriolet kwaj-extract setup.kwj setup.exe

Ruby API:

decompressor = Cabriolet::KWAJ::Decompressor.new
header = decompressor.open('setup.kwj')
decompressor.extract(header, 'setup.kwj', 'setup.exe')

HLP Files

cabriolet hlp-extract help.hlp output/

Ruby API:

decompressor = Cabriolet::HLP::Decompressor.new
header = decompressor.open('help.hlp')
decompressor.extract_all(header, 'output/')

LIT Files

# Check for DRM first
cabriolet lit-info book.lit

# Extract if not encrypted
cabriolet lit-extract book.lit output/

Ruby API:

decompressor = Cabriolet::LIT::Decompressor.new
header = decompressor.open('book.lit')

unless header.encrypted?
  decompressor.extract_all(header, 'output/')
end

OAB Files

# Full file
cabriolet oab-extract full.oab address.dat

# Incremental patch
cabriolet oab-extract --base=old.oab patch.oab new.oab

Ruby API:

decompressor = Cabriolet::OAB::Decompressor.new

# Full file
decompressor.decompress('full.oab', 'address.dat')

# Patch
decompressor.decompress_incremental('patch.oab', 'old.oab', 'new.oab')

Common patterns

Batch Extraction

# Extract all CAB files
for file in *.cab; do
  cabriolet extract "$file" "extracted/$(basename "$file" .cab)"
done

Selective Extraction

decompressor = Cabriolet::CAB::Decompressor.new
cabinet = decompressor.open('archive.cab')

# Extract only .txt files
cabinet.files.each do |file|
  if file.filename.end_with?('.txt')
    decompressor.extract_file(file, "output/#{file.filename}")
  end
end

Progress Tracking

decompressor = Cabriolet::CAB::Decompressor.new
cabinet = decompressor.open('archive.cab')

cabinet.files.each_with_index do |file, i|
  puts "Extracting #{i+1}/#{cabinet.files.count}: #{file.filename}"
  decompressor.extract_file(file, "output/#{file.filename}")
end

Best practices

  1. Check before extracting - Verify archive integrity

  2. Create output directories - Ensure destination exists

  3. Handle errors - Catch and handle extraction failures

  4. Preserve paths - Maintain directory structure

  5. Verify DRM - Check LIT files for encryption