class PureRubyZip::ZipFile

Public Class Methods

new(filename) click to toggle source
# File lib/pure_ruby_zip.rb, line 240
def initialize(filename)
  @filename = filename
  get_items_metadata @filename
end

Public Instance Methods

decompress_all_files() click to toggle source
# File lib/pure_ruby_zip.rb, line 249
def decompress_all_files
  decompressed_files = []
  File.open(@filename) do |file|
    decompressed_files = @items.keys.map do |path|
      {
        path: path,
        data: @items[path].get_decompressed_data(file)
      }
    end
  end
  decompressed_files
end
decompress_all_files_to_disk() click to toggle source
# File lib/pure_ruby_zip.rb, line 261
def decompress_all_files_to_disk
  dir_of_zip_file = File.dirname(@filename)
  zipfile_without_extension = File.basename @filename, ".*"
  extract_dir_path = "#{dir_of_zip_file}/#{zipfile_without_extension}"
  Dir.mkdir(extract_dir_path) unless Dir.exist?(extract_dir_path)
  decompress_all_files.each do |decompressed_item|
    path = decompressed_item[:path]
    data = decompressed_item[:data]
    file_extract_path = "#{extract_dir_path}/#{path}"
    File.open(file_extract_path, "w") do |extracted_file|
      extracted_file.write data
    end
  end
end
decompress_file(path) click to toggle source
# File lib/pure_ruby_zip.rb, line 244
def decompress_file(path)
  File.open(@filename) do |file|
    @items[path].get_decompressed_data file
  end
end

Private Instance Methods

find_central_directory(file) click to toggle source
# File lib/pure_ruby_zip.rb, line 205
def find_central_directory(file)
  find_string file, "\x50\x4b\x01\x02"
end
find_eocd(file) click to toggle source
# File lib/pure_ruby_zip.rb, line 202
def find_eocd(file)
  find_string file, "\x50\x4b\x05\x06"
end
get_items_metadata(file) click to toggle source
# File lib/pure_ruby_zip.rb, line 216
def get_items_metadata(file)
  File.open(@filename) do |file|
    # Read number of entries
    num_entries = get_number_of_items file
    # Rewind file
    file.seek 0
    @items = Hash[(0..(num_entries - 1)).map {
      # Find central directory record
      find_central_directory file
      # Skip to filename length
      skip file, 24
      # Get filename length
      filename_length = read_int file, 2
      # Skip to file offset
      skip file, 12
      # Get file offset
      file_offset = read_int file, 4
      # Get filename
      filename = file.read(filename_length)
      [filename, ZipFileItem.new(filename, file_offset)]
    }]
  end
end
get_number_of_items(file) click to toggle source
# File lib/pure_ruby_zip.rb, line 208
def get_number_of_items(file)
  # Find the EOCD (End Of Central Directory)
  find_eocd file
  # Skip to number of entries (items in zipfile)
  skip file, 6
  # Read number of entries
  num_entries = read_int file, 2
end