2002-07-26 22:12:34 +08:00
|
|
|
#!/usr/bin/env ruby
|
|
|
|
|
|
2002-07-27 04:58:51 +08:00
|
|
|
require 'filearchive'
|
|
|
|
|
|
2002-07-27 06:20:25 +08:00
|
|
|
module Zip
|
|
|
|
|
class ZipFileSystem
|
|
|
|
|
|
2002-07-26 22:12:34 +08:00
|
|
|
def initialize(zipFile)
|
|
|
|
|
@zipFile = zipFile
|
|
|
|
|
end
|
2002-07-27 06:20:25 +08:00
|
|
|
|
|
|
|
|
def dir
|
|
|
|
|
@zipFsDir ||= Dir.new(@zipFile)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def file
|
|
|
|
|
@zipFsDir ||= ZipFsFile.new(@zipFile)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
class ZipFsFile
|
|
|
|
|
def initialize(zipFile)
|
|
|
|
|
@zipFile = zipFile
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def exists?(fileName)
|
|
|
|
|
@zipFile.findEntry(fileName) != nil
|
|
|
|
|
end
|
|
|
|
|
alias :exist? :exists?
|
|
|
|
|
|
|
|
|
|
def directory?(fileName)
|
|
|
|
|
entry = @zipFile.findEntry(fileName)
|
|
|
|
|
entry != nil && entry.directory?
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def open(fileName, openMode = "r", &block)
|
|
|
|
|
raise StandardError, "openmode '#{openMode} not supported" unless openMode == "r"
|
|
|
|
|
@zipFile.getInputStream(fileName, &block)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def size(fileName)
|
|
|
|
|
@zipFile.getEntry(fileName).size
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
# nil for not found and nil for directories
|
|
|
|
|
def size?(fileName)
|
|
|
|
|
entry = @zipFile.findEntry(fileName)
|
|
|
|
|
return (entry == nil || entry.directory?) ? nil : entry.size
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def zero?(fileName)
|
|
|
|
|
sz = size(fileName)
|
|
|
|
|
sz == nil || sz == 0
|
|
|
|
|
rescue Errno::ENOENT
|
|
|
|
|
false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def file?(fileName)
|
|
|
|
|
entry = @zipFile.findEntry(fileName)
|
|
|
|
|
entry != nil && entry.file?
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def dirname(fileName)
|
|
|
|
|
::File.dirname(fileName)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def basename(fileName)
|
|
|
|
|
::File.basename(fileName)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def split(fileName)
|
|
|
|
|
::File.split(fileName)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def join(*fragments)
|
|
|
|
|
::File.join(*fragments)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def mtime(fileName)
|
|
|
|
|
@zipFile.getEntry(fileName).mtime
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def pipe?(filename)
|
|
|
|
|
false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def blockdev?(filename)
|
|
|
|
|
false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def symlink?(fileName)
|
|
|
|
|
false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def socket?(fileName)
|
|
|
|
|
false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def ftype(fileName)
|
|
|
|
|
@zipFile.getEntry(fileName).directory? ? "directory" : "file"
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def readlink(fileName)
|
|
|
|
|
raise NotImplementedError, "The readlink() function is not implemented to ZipFileSystem"
|
|
|
|
|
end
|
2002-07-27 06:23:32 +08:00
|
|
|
|
|
|
|
|
def symlink(fileName, symlinkName)
|
|
|
|
|
raise NotImplementedError, "The symlink() function is not implemented to ZipFileSystem"
|
|
|
|
|
end
|
2002-07-27 06:25:36 +08:00
|
|
|
|
|
|
|
|
def link(fileName, symlinkName)
|
|
|
|
|
raise NotImplementedError, "The link() function is not implemented to ZipFileSystem"
|
|
|
|
|
end
|
2002-07-27 05:32:12 +08:00
|
|
|
end
|
2002-07-26 22:12:34 +08:00
|
|
|
end
|
|
|
|
|
end
|