Object
# File lib/zip/entry.rb, line 53 def initialize(*args) name = args[1] || '' check_name(name) set_default_vars_values @fstype = ::Zip::RUNNING_ON_WINDOWS ? ::Zip::FSTYPE_FAT : ::Zip::FSTYPE_UNIX @zipfile = args[0] || '' @name = name @comment = args[2] || '' @extra = args[3] || '' @compressed_size = args[4] || 0 @crc = args[5] || 0 @compression_method = args[6] || ::Zip::Entry::DEFLATED @size = args[7] || 0 @time = args[8] || ::Zip::DOSTime.now @ftype = name_is_directory? ? :directory : :file @extra = ::Zip::ExtraField.new(@extra.to_s) unless ::Zip::ExtraField === @extra end
# File lib/zip/entry.rb, line 473 def <=> (other) self.to_s <=> other.to_s end
# File lib/zip/entry.rb, line 464 def ==(other) return false unless other.class == self.class # Compares contents of local entry and exposed fields keys_equal = %(compression_method crc compressed_size size name extra filepath).all? do |k| other.__send__(k.to_sym) == self.__send__(k.to_sym) end keys_equal && self.time.dos_equals(other.time) end
# File lib/zip/entry.rb, line 345 def check_c_dir_entry_comment_size unless @comment && @comment.bytesize == @comment_length raise ::Zip::Error, "Truncated cdir zip entry header" end end
# File lib/zip/entry.rb, line 339 def check_c_dir_entry_signature unless header_signature == ::Zip::CENTRAL_DIRECTORY_ENTRY_SIGNATURE raise Error, "Zip local header magic not found at location '#{local_header_offset}'" end end
# File lib/zip/entry.rb, line 333 def check_c_dir_entry_static_header_length(buf) unless buf.bytesize == ::Zip::CDIR_ENTRY_STATIC_HEADER_LENGTH raise Error, 'Premature end of file. Not enough data for zip cdir entry header' end end
# File lib/zip/entry.rb, line 47 def check_name(name) if name.start_with?('/') raise ::Zip::EntryNameError, "Illegal ZipEntry name '#{name}', name must not start with /" end end
# File lib/zip/entry.rb, line 563 def clean_up # By default, do nothing end
# File lib/zip/entry.rb, line 122 def comment_size @comment ? @comment.bytesize : 0 end
# File lib/zip/entry.rb, line 118 def extra_size @extra ? @extra.local_size : 0 end
Extracts entry to file dest_path (defaults to @name).
# File lib/zip/entry.rb, line 148 def extract(dest_path = @name, &block) block ||= proc { ::Zip.on_exists_proc } if directory? || file? || symlink? self.__send__("create_#{@ftype}", dest_path, &block) else raise RuntimeError, "unknown file type #{self.inspect}" end self end
# File lib/zip/entry.rb, line 94 def file_type_is?(type) raise InternalError, "current filetype is unknown: #{self.inspect}" unless @ftype @ftype == type end
Returns an IO like object for the given ZipEntry. Warning: may behave weird with symlinks.
# File lib/zip/entry.rb, line 479 def get_input_stream(&block) if @ftype == :directory yield ::Zip::NullInputStream if block_given? ::Zip::NullInputStream elsif @filepath case @ftype when :file ::File.open(@filepath, 'rb', &block) when :symlink linkpath = ::File.readlink(@filepath) stringio = ::StringIO.new(linkpath) yield(stringio) if block_given? stringio else raise "unknown @file_type #{@ftype}" end else zis = ::Zip::InputStream.new(@zipfile, local_header_offset) zis.get_next_entry if block_given? begin yield(zis) ensure zis.close end else zis end end end
# File lib/zip/entry.rb, line 555 def get_raw_input_stream(&block) if @zipfile.is_a?(::IO) || @zipfile.is_a?(::StringIO) yield @zipfile else ::File.open(@zipfile, "rb", &block) end end
# File lib/zip/entry.rb, line 114 def name_size @name ? @name.bytesize : 0 end
# File lib/zip/entry.rb, line 409 def pack_c_dir_entry zip64 = @extra['Zip64'] [ @header_signature, @version, # version of encoding software @fstype, # filesystem type @version_needed_to_extract, # @versionNeededToExtract , @gp_flags, # @gp_flags , @compression_method, @time.to_binary_dos_time, # @last_mod_time , @time.to_binary_dos_date, # @last_mod_date , @crc, (zip64 && zip64.compressed_size) ? 0xFFFFFFFF : @compressed_size, (zip64 && zip64.original_size) ? 0xFFFFFFFF : @size, name_size, @extra ? @extra.c_dir_size : 0, comment_size, (zip64 && zip64.disk_start_number) ? 0xFFFF : 0, # disk number start @internal_file_attributes, # file type (binary=0, text=1) @external_file_attributes, # native filesystem attributes (zip64 && zip64.relative_header_offset) ? 0xFFFFFFFF : @local_header_offset, @name, @extra, @comment ].pack('VCCvvvvvVVVvvvvvVV') end
# File lib/zip/entry.rb, line 253 def pack_local_entry zip64 = @extra['Zip64'] [::Zip::LOCAL_ENTRY_SIGNATURE, @version_needed_to_extract, # version needed to extract @gp_flags, # @gp_flags , @compression_method, @time.to_binary_dos_time, # @last_mod_time , @time.to_binary_dos_date, # @last_mod_date , @crc, (zip64 && zip64.compressed_size) ? 0xFFFFFFFF : @compressed_size, (zip64 && zip64.original_size) ? 0xFFFFFFFF : @size, name_size, @extra ? @extra.local_size : 0].pack('VvvvvvVVVvv') end
# File lib/zip/entry.rb, line 549 def parent_as_string entry_name = name.chomp('/') slash_index = entry_name.rindex('/') slash_index ? entry_name.slice(0, slash_index+1) : nil end
# File lib/zip/entry.rb, line 351 def read_c_dir_extra_field(io) if @extra.is_a?(::Zip::ExtraField) @extra.merge(io.read(@extra_length)) else @extra = ::Zip::ExtraField.new(io.read(@extra_length)) end end
# File lib/zip/entry.rb, line 16 def set_default_vars_values @local_header_offset = 0 @local_header_size = nil # not known until local entry is created or read @internal_file_attributes = 1 @external_file_attributes = 0 @header_signature = ::Zip::CENTRAL_DIRECTORY_ENTRY_SIGNATURE @version_needed_to_extract = VERSION_NEEDED_TO_EXTRACT @version = VERSION_MADE_BY @ftype = nil # unspecified or unknown @filepath = nil @gp_flags = 0 if ::Zip.unicode_names @gp_flags |= EFS @version = 63 end @follow_symlinks = false @restore_times = true @restore_permissions = false @restore_ownership = false # BUG: need an extra field to support uid/gid's @unix_uid = nil @unix_gid = nil @unix_perms = nil #@posix_acl = nil #@ntfs_acl = nil @dirty = false end
# File lib/zip/entry.rb, line 304 def set_ftype_from_c_dir_entry @ftype = case @fstype when ::Zip::FSTYPE_UNIX @unix_perms = (@external_file_attributes >> 16) & 07777 case (@external_file_attributes >> 28) when ::Zip::FILE_TYPE_DIR :directory when ::Zip::FILE_TYPE_FILE :file when ::Zip::FILE_TYPE_SYMLINK :symlink else #best case guess for whether it is a file or not #Otherwise this would be set to unknown and that entry would never be able to extracted if name_is_directory? :directory else :file end end else if name_is_directory? :directory else :file end end end
# File lib/zip/entry.rb, line 390 def set_unix_permissions_on_path(dest_path) # BUG: does not update timestamps into account # ignore setuid/setgid bits by default. honor if @restore_ownership unix_perms_mask = 01777 unix_perms_mask = 07777 if @restore_ownership ::FileUtils.chmod(@unix_perms & unix_perms_mask, dest_path) if @restore_permissions && @unix_perms ::FileUtils.chown(@unix_uid, @unix_gid, dest_path) if @restore_ownership && @unix_uid && @unix_gid && ::Process.egid == 0 # File::utimes() end
# File lib/zip/entry.rb, line 74 def time if @extra['UniversalTime'] @extra['UniversalTime'].mtime else # Standard time field in central directory has local time # under archive creator. Then, we can't get timezone. @time end end
# File lib/zip/entry.rb, line 86 def time=(value) unless @extra.member?('UniversalTime') @extra.create('UniversalTime') end @extra['UniversalTime'].mtime = value @time = value end
# File lib/zip/entry.rb, line 280 def unpack_c_dir_entry(buf) @header_signature, @version, # version of encoding software @fstype, # filesystem type @version_needed_to_extract, @gp_flags, @compression_method, @last_mod_time, @last_mod_date, @crc, @compressed_size, @size, @name_length, @extra_length, @comment_length, _, # diskNumberStart @internal_file_attributes, @external_file_attributes, @local_header_offset, @name, @extra, @comment = buf.unpack('VCCvvvvvVVVvvvvvVV') end
# File lib/zip/entry.rb, line 204 def unpack_local_entry(buf) @header_signature, @version, @fstype, @gp_flags, @compression_method, @last_mod_time, @last_mod_date, @crc, @compressed_size, @size, @name_length, @extra_length = buf.unpack('VCCvvvvVVVvv') end
check before rewriting an entry (after file sizes are known) that we didn’t change the header size (and thus clobber file data or something)
# File lib/zip/entry.rb, line 132 def verify_local_header_size! return if @local_header_size.nil? new_size = calculate_local_header_size raise Error, "local header size changed (#{@local_header_size} -> #{new_size})" if @local_header_size != new_size end
Generated with the Darkfish Rdoc Generator 2.