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