class Zip::FileSystem::ZipFsFile

Instances of this class are normally accessed via the accessor Zip::File::file. An instance of ZipFsFile behaves like ruby’s builtin File (class) object, except it works on Zip::File entries.

The individual methods are not documented due to their similarity with the methods in File

Attributes

dir[W]

Public Class Methods

new(mapped_zip) click to toggle source
# File lib/zip/filesystem.rb, line 171
def initialize(mapped_zip)
  @mapped_zip = mapped_zip
end

Public Instance Methods

atime(filename) click to toggle source
# File lib/zip/filesystem.rb, line 326
def atime(filename)
  e = get_entry(filename)
  if e.extra.member? 'UniversalTime'
    e.extra['UniversalTime'].atime
  elsif e.extra.member? 'NTFS'
    e.extra['NTFS'].atime
  end
end
basename(filename) click to toggle source
# File lib/zip/filesystem.rb, line 304
def basename(filename)
  ::File.basename(filename)
end
blockdev?(_filename) click to toggle source
# File lib/zip/filesystem.rb, line 348
def blockdev?(_filename)
  false
end
chardev?(_filename) click to toggle source
# File lib/zip/filesystem.rb, line 352
def chardev?(_filename)
  false
end
chmod(mode, *filenames) click to toggle source
# File lib/zip/filesystem.rb, line 277
def chmod(mode, *filenames)
  filenames.each do |filename|
    e = get_entry(filename)
    e.fstype = 3 # force convertion filesystem type to unix
    e.unix_perms = mode
    e.external_file_attributes = mode << 16
    e.dirty = true
  end
  filenames.size
end
chown(owner, group, *filenames) click to toggle source
# File lib/zip/filesystem.rb, line 267
def chown(owner, group, *filenames)
  filenames.each do |filename|
    e = get_entry(filename)
    e.extra.create('IUnix') unless e.extra.member?('IUnix')
    e.extra['IUnix'].uid = owner
    e.extra['IUnix'].gid = group
  end
  filenames.size
end
ctime(filename) click to toggle source
# File lib/zip/filesystem.rb, line 335
def ctime(filename)
  e = get_entry(filename)
  if e.extra.member? 'UniversalTime'
    e.extra['UniversalTime'].ctime
  elsif e.extra.member? 'NTFS'
    e.extra['NTFS'].ctime
  end
end
delete(*args) click to toggle source
# File lib/zip/filesystem.rb, line 408
def delete(*args)
  args.each do |filename|
    if directory?(filename)
      raise Errno::EISDIR, "Is a directory - \"#{filename}\""
    end

    @mapped_zip.remove(filename)
  end
end
Also aliased as: unlink
directory?(filename) click to toggle source
# File lib/zip/filesystem.rb, line 236
def directory?(filename)
  entry = @mapped_zip.find_entry(filename)
  expand_path(filename) == '/' || (!entry.nil? && entry.directory?)
end
dirname(filename) click to toggle source
# File lib/zip/filesystem.rb, line 300
def dirname(filename)
  ::File.dirname(filename)
end
executable?(filename) click to toggle source
# File lib/zip/filesystem.rb, line 211
def executable?(filename)
  unix_mode_cmp(filename, 0o111)
end
Also aliased as: executable_real?
executable_real?(filename)
Alias for: executable?
exist?(filename)
Alias for: exists?
exists?(filename) click to toggle source
# File lib/zip/filesystem.rb, line 192
def exists?(filename)
  expand_path(filename) == '/' || !@mapped_zip.find_entry(filename).nil?
end
Also aliased as: exist?, owned?, grpowned?
expand_path(path) click to toggle source
# File lib/zip/filesystem.rb, line 424
def expand_path(path)
  @mapped_zip.expand_path(path)
end
file?(filename) click to toggle source
# File lib/zip/filesystem.rb, line 295
def file?(filename)
  entry = @mapped_zip.find_entry(filename)
  !entry.nil? && entry.file?
end
foreach(filename, sep = $INPUT_RECORD_SEPARATOR, &a_proc) click to toggle source
# File lib/zip/filesystem.rb, line 404
def foreach(filename, sep = $INPUT_RECORD_SEPARATOR, &a_proc)
  self.open(filename) { |is| is.each_line(sep, &a_proc) }
end
ftype(filename) click to toggle source
# File lib/zip/filesystem.rb, line 364
def ftype(filename)
  @mapped_zip.get_entry(filename).directory? ? 'directory' : 'file'
end
grpowned?(filename)
Alias for: exists?
join(*fragments) click to toggle source
# File lib/zip/filesystem.rb, line 312
def join(*fragments)
  ::File.join(*fragments)
end
lstat(filename)
Alias for: stat
mtime(filename) click to toggle source
# File lib/zip/filesystem.rb, line 322
def mtime(filename)
  @mapped_zip.get_entry(filename).mtime
end
new(filename, mode = 'r') click to toggle source
# File lib/zip/filesystem.rb, line 253
def new(filename, mode = 'r')
  self.open(filename, mode)
end
open(filename, mode = 'r', permissions = 0o644, &block) click to toggle source
# File lib/zip/filesystem.rb, line 241
def open(filename, mode = 'r', permissions = 0o644, &block)
  mode.delete!('b') # ignore b option
  case mode
  when 'r'
    @mapped_zip.get_input_stream(filename, &block)
  when 'w'
    @mapped_zip.get_output_stream(filename, permissions, &block)
  else
    raise StandardError, "openmode '#{mode} not supported" unless mode == 'r'
  end
end
owned?(filename)

Permissions not implemented, so if the file exists it is accessible

Alias for: exists?
pipe() click to toggle source
# File lib/zip/filesystem.rb, line 380
def pipe
  raise NotImplementedError, 'The pipe() function is not implemented'
end
pipe?(_filename) click to toggle source
# File lib/zip/filesystem.rb, line 344
def pipe?(_filename)
  false
end
popen(*args, &a_proc) click to toggle source
# File lib/zip/filesystem.rb, line 400
def popen(*args, &a_proc)
  ::File.popen(*args, &a_proc)
end
read(filename) click to toggle source
# File lib/zip/filesystem.rb, line 396
def read(filename)
  @mapped_zip.read(filename)
end
readable?(filename) click to toggle source
# File lib/zip/filesystem.rb, line 201
def readable?(filename)
  unix_mode_cmp(filename, 0o444)
end
Also aliased as: readable_real?
readable_real?(filename)
Alias for: readable?
readlines(filename) click to toggle source
# File lib/zip/filesystem.rb, line 392
def readlines(filename)
  self.open(filename, &:readlines)
end
rename(file_to_rename, new_name) click to toggle source
# File lib/zip/filesystem.rb, line 418
def rename(file_to_rename, new_name)
  @mapped_zip.rename(file_to_rename, new_name) { true }
end
setgid?(filename) click to toggle source
# File lib/zip/filesystem.rb, line 220
def setgid?(filename)
  unix_mode_cmp(filename, 0o2000)
end
setuid?(filename) click to toggle source
# File lib/zip/filesystem.rb, line 216
def setuid?(filename)
  unix_mode_cmp(filename, 0o4000)
end
size(filename) click to toggle source
# File lib/zip/filesystem.rb, line 257
def size(filename)
  @mapped_zip.get_entry(filename).size
end
size?(filename) click to toggle source

Returns nil for not found and nil for directories

# File lib/zip/filesystem.rb, line 262
def size?(filename)
  entry = @mapped_zip.find_entry(filename)
  entry.nil? || entry.directory? ? nil : entry.size
end
socket?(_filename) click to toggle source
# File lib/zip/filesystem.rb, line 360
def socket?(_filename)
  false
end
split(filename) click to toggle source
# File lib/zip/filesystem.rb, line 308
def split(filename)
  ::File.split(filename)
end
stat(filename) click to toggle source
# File lib/zip/filesystem.rb, line 384
def stat(filename)
  raise Errno::ENOENT, filename unless exists?(filename)

  ZipFsStat.new(self, filename)
end
Also aliased as: lstat
sticky?(filename) click to toggle source
# File lib/zip/filesystem.rb, line 224
def sticky?(filename)
  unix_mode_cmp(filename, 0o1000)
end
truncate(_filename, _len) click to toggle source
# File lib/zip/filesystem.rb, line 232
def truncate(_filename, _len)
  raise StandardError, 'truncate not supported'
end
umask(*args) click to toggle source
# File lib/zip/filesystem.rb, line 228
def umask(*args)
  ::File.umask(*args)
end
utime(modified_time, *filenames) click to toggle source
# File lib/zip/filesystem.rb, line 316
def utime(modified_time, *filenames)
  filenames.each do |filename|
    get_entry(filename).time = modified_time
  end
end
writable?(filename) click to toggle source
# File lib/zip/filesystem.rb, line 206
def writable?(filename)
  unix_mode_cmp(filename, 0o222)
end
Also aliased as: writable_real?
writable_real?(filename)
Alias for: writable?
zero?(filename) click to toggle source
# File lib/zip/filesystem.rb, line 288
def zero?(filename)
  sz = size(filename)
  sz.nil? || sz == 0
rescue Errno::ENOENT
  false
end

Private Instance Methods

get_entry(filename) click to toggle source
# File lib/zip/filesystem.rb, line 175
def get_entry(filename)
  unless exists?(filename)
    raise Errno::ENOENT, "No such file or directory - #{filename}"
  end

  @mapped_zip.find_entry(filename)
end
unix_mode_cmp(filename, mode) click to toggle source
# File lib/zip/filesystem.rb, line 184
def unix_mode_cmp(filename, mode)
  e = get_entry(filename)
  e.fstype == 3 && ((e.external_file_attributes >> 16) & mode) != 0
rescue Errno::ENOENT
  false
end