Class: Zip::ZipCentralDirectory
- Inherits:
-
Object
- Object
- Zip::ZipCentralDirectory
- Includes:
- Enumerable
- Defined in:
- lib/zip/zip.rb
Direct Known Subclasses
Constant Summary
- END_OF_CENTRAL_DIRECTORY_SIGNATURE =
0x06054b50- MAX_END_OF_CENTRAL_DIRECTORY_STRUCTURE_SIZE =
65536 + 18
- STATIC_EOCD_SIZE =
22
Instance Attribute Summary (collapse)
-
- (Object) comment
readonly
Returns the value of attribute comment.
Class Method Summary (collapse)
-
+ (Object) read_from_stream(io)
:nodoc:.
Instance Method Summary (collapse)
-
- (Object) ==(other)
:nodoc:.
-
- (Object) each(&proc)
For iterating over the entries.
-
- (Object) entries
Returns an Enumerable containing the entries.
-
- (Object) get_e_o_c_d(io)
:nodoc:.
-
- (ZipCentralDirectory) initialize(entries = ZipEntrySet.new, comment = ""))
constructor
:nodoc:.
-
- (Object) read_central_directory_entries(io)
:nodoc:.
-
- (Object) read_e_o_c_d(io)
:nodoc:.
-
- (Object) read_from_stream(io)
:nodoc:.
-
- (Object) size
Returns the number of entries in the central directory (and consequently in the zip archive).
-
- (Object) write_to_stream(io)
:nodoc:.
Methods included from Enumerable
Constructor Details
- (ZipCentralDirectory) initialize(entries = ZipEntrySet.new, comment = ""))
:nodoc:
1197 1198 1199 1200 1201 |
# File 'lib/zip/zip.rb', line 1197 def initialize(entries = ZipEntrySet.new, comment = "") #:nodoc: super() @entrySet = entries.kind_of?(ZipEntrySet) ? entries : ZipEntrySet.new(entries) @comment = comment end |
Instance Attribute Details
- (Object) comment (readonly)
Returns the value of attribute comment
1190 1191 1192 |
# File 'lib/zip/zip.rb', line 1190 def comment @comment end |
Class Method Details
+ (Object) read_from_stream(io)
:nodoc:
1301 1302 1303 1304 1305 1306 1307 |
# File 'lib/zip/zip.rb', line 1301 def ZipCentralDirectory.read_from_stream(io) #:nodoc: cdir = new cdir.read_from_stream(io) return cdir rescue ZipError return nil end |
Instance Method Details
- (Object) ==(other)
:nodoc:
1309 1310 1311 1312 |
# File 'lib/zip/zip.rb', line 1309 def == (other) #:nodoc: return false unless other.kind_of?(ZipCentralDirectory) @entrySet.entries.sort == other.entries.sort && comment == other.comment end |
- (Object) each(&proc)
For iterating over the entries.
1291 1292 1293 |
# File 'lib/zip/zip.rb', line 1291 def each(&proc) @entrySet.each(&proc) end |
- (Object) entries
Returns an Enumerable containing the entries.
1193 1194 1195 |
# File 'lib/zip/zip.rb', line 1193 def entries @entrySet.entries end |
- (Object) get_e_o_c_d(io)
:nodoc:
1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 |
# File 'lib/zip/zip.rb', line 1259 def get_e_o_c_d(io) #:nodoc: begin io.seek(-MAX_END_OF_CENTRAL_DIRECTORY_STRUCTURE_SIZE, IO::SEEK_END) rescue Errno::EINVAL io.seek(0, IO::SEEK_SET) rescue Errno::EFBIG # FreeBSD 4.9 raise Errno::EFBIG instead of Errno::EINVAL io.seek(0, IO::SEEK_SET) end # 'buf = io.read' substituted with lump of code to work around FreeBSD 4.5 issue retried = false buf = nil begin buf = io.read rescue Errno::EFBIG # FreeBSD 4.5 may raise Errno::EFBIG raise if (retried) retried = true io.seek(0, IO::SEEK_SET) retry end sigIndex = buf.rindex([END_OF_CENTRAL_DIRECTORY_SIGNATURE].pack('V')) raise ZipError, "Zip end of central directory signature not found" unless sigIndex buf=buf.slice!((sigIndex+4)...(buf.size)) def buf.read(count) slice!(0, count) end return buf end |
- (Object) read_central_directory_entries(io)
:nodoc:
1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 |
# File 'lib/zip/zip.rb', line 1242 def read_central_directory_entries(io) #:nodoc: begin io.seek(@cdirOffset, IO::SEEK_SET) rescue Errno::EINVAL raise ZipError, "Zip consistency problem while reading central directory entry" end @entrySet = ZipEntrySet.new @size.times { @entrySet << ZipEntry.read_c_dir_entry(io) } end |
- (Object) read_e_o_c_d(io)
:nodoc:
1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 |
# File 'lib/zip/zip.rb', line 1229 def read_e_o_c_d(io) #:nodoc: buf = get_e_o_c_d(io) @numberOfThisDisk = ZipEntry::read_zip_short(buf) @numberOfDiskWithStartOfCDir = ZipEntry::read_zip_short(buf) @totalNumberOfEntriesInCDirOnThisDisk = ZipEntry::read_zip_short(buf) @size = ZipEntry::read_zip_short(buf) @sizeInBytes = ZipEntry::read_zip_long(buf) @cdirOffset = ZipEntry::read_zip_long(buf) commentLength = ZipEntry::read_zip_short(buf) @comment = buf.read(commentLength) raise ZipError, "Zip consistency problem while reading eocd structure" unless buf.size == 0 end |
- (Object) read_from_stream(io)
:nodoc:
1254 1255 1256 1257 |
# File 'lib/zip/zip.rb', line 1254 def read_from_stream(io) #:nodoc: read_e_o_c_d(io) read_central_directory_entries(io) end |
- (Object) size
Returns the number of entries in the central directory (and consequently in the zip archive).
1297 1298 1299 |
# File 'lib/zip/zip.rb', line 1297 def size @entrySet.size end |
- (Object) write_to_stream(io)
:nodoc:
1203 1204 1205 1206 1207 |
# File 'lib/zip/zip.rb', line 1203 def write_to_stream(io) #:nodoc: offset = io.tell @entrySet.each { |entry| entry.write_c_dir_entry(io) } write_e_o_c_d(io, offset) end |