# File lib/zip/zip_entry.rb, line 61 def initialize(zipfile = "", name = "", comment = "", extra = "", compressed_size = 0, crc = 0, compression_method = ZipEntry::DEFLATED, size = 0, time = DOSTime.now) super() if name.start_with?("/") raise ZipEntryNameError, "Illegal ZipEntry name '#{name}', name must not start with /" end @localHeaderOffset = 0 @local_header_size = 0 @internalFileAttributes = 1 @externalFileAttributes = 0 @header_signature = CENTRAL_DIRECTORY_ENTRY_SIGNATURE @versionNeededToExtract = VERSION_NEEDED_TO_EXTRACT @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 @gp_flags = 0 @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 @dirty = false end
# File lib/zip/zip_entry.rb, line 475 def <=> (other) return to_s <=> other.to_s end
# File lib/zip/zip_entry.rb, line 462 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
# File lib/zip/zip_entry.rb, line 588 def create_directory(destPath) if ::File.directory?(destPath) return elsif ::File.exists?(destPath) if block_given? && yield(self, destPath) FileUtils::rm_f destPath else raise ZipDestinationFileExistsError, "Cannot create directory '#{destPath}'. "+ "A file already exists with that name" end end Dir.mkdir destPath set_extra_attributes_on_path(destPath) end
BUG: create_symlink() does not use &onExistsProc
# File lib/zip/zip_entry.rb, line 605 def create_symlink(destPath) stat = nil begin stat = ::File::lstat(destPath) rescue Errno::ENOENT end io = get_input_stream linkto = io.read if stat if stat.symlink? if ::File::readlink(destPath) == linkto return else raise ZipDestinationFileExistsError, "Cannot create symlink '#{destPath}'. "+ "A symlink already exists with that name" end else raise ZipDestinationFileExistsError, "Cannot create symlink '#{destPath}'. "+ "A file already exists with that name" end end ::File::symlink(linkto, destPath) end
Returns true if the entry is a directory.
# File lib/zip/zip_entry.rb, line 140 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_entry.rb, line 180 def extract(destPath = @name, &onExistsProc) onExistsProc ||= proc { Zip.options[:on_exists_proc] } 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_entry.rb, line 147 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_entry.rb, line 481 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_entry.rb, line 559 def get_raw_input_stream(&aProc) ::File.open(@zipfile, "rb", &aProc) end
# File lib/zip/zip_entry.rb, line 553 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/zip_entry.rb, line 565 def set_time(binaryDosDate, binaryDosTime) @time = DOSTime.parse_binary_dos_format(binaryDosDate, binaryDosTime) rescue ArgumentError puts "Invalid date/time in zip entry" end
Returns true if the entry is a symlink.
# File lib/zip/zip_entry.rb, line 153 def symlink? raise ZipInternalError, "current filetype is unknown: #{self.inspect}" unless @ftype @ftype == :symlink end
# File lib/zip/zip_entry.rb, line 120 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/zip_entry.rb, line 131 def time=(aTime) unless @extra.member?("UniversalTime") @extra.create("UniversalTime") end @extra["UniversalTime"].mtime = aTime @time = aTime end
# File lib/zip/zip_entry.rb, line 571 def write_file(destPath, continueOnExistsProc = proc { Zip.options[:continue_on_exists_proc] }) if ::File.exists?(destPath) && ! yield(self, destPath) raise ZipDestinationFileExistsError, "Destination '#{destPath}' already exists" end ::File.open(destPath, "wb") do |os| get_input_stream do |is| set_extra_attributes_on_path(destPath) buf = '' while buf = is.sysread(Decompressor::CHUNK_SIZE, buf) os << buf end end end end
Generated with the Darkfish Rdoc Generator 2.