# File lib/zip/zip.rb, line 368 def initialize(zipfile = "", name = "", comment = "", extra = "", compressed_size = 0, crc = 0, compression_method = ZipEntry::DEFLATED, size = 0, time = Time.now) super() if name.starts_with("/") raise ZipEntryNameError, "Illegal ZipEntry name '#{name}', name must not start with /" end @localHeaderOffset = 0 @local_header_size = 0 @internalFileAttributes = 1 @externalFileAttributes = 0 @version = 52 # this library's version @ftype = nil # unspecified or unknown @filepath = nil if Zip::RUNNING_ON_WINDOWS @fstype = FSTYPE_FAT else @fstype = FSTYPE_UNIX end @zipfile = zipfile @comment = comment @compressed_size = compressed_size @crc = crc @extra = extra @compression_method = compression_method @name = name @size = size @time = time @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 if name_is_directory? @ftype = :directory else @ftype = :file end unless ZipExtraField === @extra @extra = ZipExtraField.new(@extra.to_s) end end
# File lib/zip/zip.rb, line 559 def ZipEntry.read_local_entry(io) entry = new(io.path) entry.read_local_entry(io) return entry rescue ZipError return nil end
# File lib/zip/zip.rb, line 759 def <=> (other) return to_s <=> other.to_s end
# File lib/zip/zip.rb, line 746 def == (other) return false unless other.class == self.class # Compares contents of local entry and exposed fields (@compression_method == other.compression_method && @crc == other.crc && @compressed_size == other.compressed_size && @size == other.size && @name == other.name && @extra == other.extra && @filepath == other.filepath && self.time.dos_equals(other.time)) end
Returns the name in the encoding specified by enc
# File lib/zip/zip.rb, line 364 def comment_in(enc) Iconv.conv(enc, name_encoding, @name) end
Returns true
if the entry is a directory.
# File lib/zip/zip.rb, line 442 def directory? raise ZipInternalError, "current filetype is unknown: #{self.inspect}" unless @ftype @ftype == :directory end
Extracts entry to file destPath (defaults to @name).
# File lib/zip/zip.rb, line 482 def extract(destPath = @name, &onExistsProc) onExistsProc ||= proc { false } if directory? create_directory(destPath, &onExistsProc) elsif file? write_file(destPath, &onExistsProc) elsif symlink? create_symlink(destPath, &onExistsProc) else raise RuntimeError, "unknown file type #{self.inspect}" end self end
Returns true
if the entry is a file.
# File lib/zip/zip.rb, line 449 def file? raise ZipInternalError, "current filetype is unknown: #{self.inspect}" unless @ftype @ftype == :file end
Returns an IO like object for the given ZipEntry. Warning: may behave weird with symlinks.
# File lib/zip/zip.rb, line 765 def get_input_stream(&aProc) if @ftype == :directory return yield(NullInputStream.instance) if block_given? return NullInputStream.instance elsif @filepath case @ftype when :file return File.open(@filepath, "rb", &aProc) when :symlink linkpath = File::readlink(@filepath) stringio = StringIO.new(linkpath) return yield(stringio) if block_given? return stringio else raise "unknown @ftype #{@ftype}" end else zis = ZipInputStream.new(@zipfile, localHeaderOffset) zis.get_next_entry if block_given? begin return yield(zis) ensure zis.close end else return zis end end end
# File lib/zip/zip.rb, line 844 def get_raw_input_stream(&aProc) File.open(@zipfile, "rb", &aProc) end
Returns the character encoding used for name and comment
# File lib/zip/zip.rb, line 354 def name_encoding (@gp_flags & 0b100000000000) != 0 ? "utf8" : "CP437//" end
Returns the name in the encoding specified by enc
# File lib/zip/zip.rb, line 359 def name_in(enc) Iconv.conv(enc, name_encoding, @name) end
# File lib/zip/zip.rb, line 838 def parent_as_string entry_name = name.chomp("/") slash_index = entry_name.rindex("/") slash_index ? entry_name.slice(0, slash_index+1) : nil end
Returns true
if the entry is a symlink.
# File lib/zip/zip.rb, line 455 def symlink? raise ZipInternalError, "current filetype is unknown: #{self.inspect}" unless @ftype @ftype == :symlink end
# File lib/zip/zip.rb, line 422 def time if @extra["UniversalTime"] @extra["UniversalTime"].mtime else # Atandard time field in central directory has local time # under archive creator. Then, we can't get timezone. @time end end
# File lib/zip/zip.rb, line 433 def time=(aTime) unless @extra.member?("UniversalTime") @extra.create("UniversalTime") end @extra["UniversalTime"].mtime = aTime @time = aTime end
# File lib/zip/zip.rb, line 498 def to_s @name end