module MultiZip::Backend::Rubyzip

Constants

BUFFER_SIZE

Public Instance Methods

extract_member(member_path, destination_path, options = {}) click to toggle source
# File lib/multi_zip/backend/rubyzip.rb, line 30
def extract_member(member_path, destination_path, options = {})
  read_operation do |zip_file|
    if member = zip_file.glob(member_path).first
      stream = member.get_input_stream

      output_file = ::File.new(destination_path, 'wb')

      while chunk = stream.read(BUFFER_SIZE)
        output_file.write chunk
      end

      output_file.close
    else
      zip_file.close
      member_not_found!(member_path)
    end
  end
  destination_path
end
list_members(prefix=nil, options={}) click to toggle source
# File lib/multi_zip/backend/rubyzip.rb, line 14
def list_members(prefix=nil, options={})
  read_operation do |zip_file|
    zip_file.map(&:name).select{|n| prefix ? n =~ /^#{prefix}/ : true}.sort
  end
end
member_info(member_path, options = {}) click to toggle source
# File lib/multi_zip/backend/rubyzip.rb, line 58
def member_info(member_path, options = {})
  read_operation do |zip_file|
    if zip_entry = zip_file.detect{|ze| ze.name == member_path}
      {
        path: zip_entry.name,
        size: zip_entry.size.to_i,
        type: zip_entry.ftype,
        original: zip_entry
      }
    else
      member_not_found!(member_path)
    end
  end
end
read_member(member_path, options = {}) click to toggle source
# File lib/multi_zip/backend/rubyzip.rb, line 3
def read_member(member_path, options = {})
  read_operation do |zip_file|
    if member = zip_file.glob(member_path).first
      member.get_input_stream.read
    else
      zip_file.close
      member_not_found!(member_path)
    end
  end
end
remove_member(member_path, options = {}) click to toggle source
# File lib/multi_zip/backend/rubyzip.rb, line 50
def remove_member(member_path, options = {})
  archive_exists!
  exists!(member_path)
  Zip::File.open(@filename) do |zipfile|
    zipfile.remove(member_path)
  end
end
write_member(member_path, member_contents, options = {}) click to toggle source
# File lib/multi_zip/backend/rubyzip.rb, line 20
def write_member(member_path, member_contents, options = {})
  flags = (File.exists?(@filename) ? nil : Zip::File::CREATE)

  Zip::File.open(@filename, flags) do |zipfile|
    zipfile.get_output_stream(member_path) do |os|
      os.write member_contents
    end
  end
end

Private Instance Methods

read_operation() { |zip_file| ... } click to toggle source
# File lib/multi_zip/backend/rubyzip.rb, line 75
def read_operation(&blk)
  archive_exists!
  Zip::File.open(@filename) do |zip_file|
    yield(zip_file)
  end
rescue Zip::Error => e
  # not the best way to detect the class of error.
  if e.message.match('Zip end of central directory signature not found')
    raise MultiZip::InvalidArchiveError.new(@filename, e)
  else
    raise
  end
end