class ZipFileGenerator

This is a simple example which uses rubyzip to recursively generate a zip file from the contents of a specified directory. The directory itself is not included in the archive, rather just its contents.

Usage:

directoryToZip = "/tmp/input"
outputFile = "/tmp/out.zip"
zf = ZipFileGenerator.new(directoryToZip, outputFile)
zf.write()

Public Class Methods

new(inputDir, outputFile) click to toggle source

Initialize with the directory to zip and the location of the output archive.

# File lib/zip/zip_file_generator.rb, line 16
def initialize(inputDir, outputFile)
  @inputDir = inputDir
  @outputFile = outputFile
end

Public Instance Methods

write() click to toggle source

Zip the input directory.

# File lib/zip/zip_file_generator.rb, line 22
def write()
  entries = Dir.entries(@inputDir); entries.delete("."); entries.delete("..")
  io = Zip::File.open(@outputFile, Zip::File::CREATE)

  writeEntries(entries, "", io)
  io.close()
end

Private Instance Methods

writeEntries(entries, path, io) click to toggle source

A helper method to make the recursion work.

# File lib/zip/zip_file_generator.rb, line 32
def writeEntries(entries, path, io)

  entries.each { |e|
    zipFilePath = path == "" ? e : File.join(path, e)
    diskFilePath = File.join(@inputDir, zipFilePath)
    # puts "Deflating " + diskFilePath
    if  File.directory?(diskFilePath)
      io.mkdir(zipFilePath)
      subdir = Dir.entries(diskFilePath); subdir.delete("."); subdir.delete("..")
      writeEntries(subdir, zipFilePath, io)
    else
      io.get_output_stream(zipFilePath) { |f| f.puts(File.open(diskFilePath, "rb").read())}
    end
  }
end