ZipArchive
from panda3d.core import ZipArchive
- class ZipArchive
Bases:
Bases:
ReferenceCount
A file that contains a set of files.
Inheritance diagram
- __init__()
- add_jar_signature(certificate: Filename, pkey: Filename, password: str, alias: str) bool
Adds a new JAR-style signature to the .zip file. The file must have been opened in read/write mode.
This implicitly causes a
repack()
operation if one is needed. Returns true on success, false on failure.This flavor of add_jar_signature() reads the certificate and private key from a PEM-formatted file, for instance as generated by the openssl command. If the private key file is password-encrypted, the third parameter will be used as the password to decrypt it.
It’s possible to add multiple signatures, by providing multiple unique aliases. Note that aliases are considered case-insensitively and only the first 8 characters are considered.
There is no separate parameter to pass a certificate chain. Instead, any necessary certificates are expected to be in the certificate file.
- add_subfile(subfile_name: str, filename: Filename, compression_level: int) str
Adds a file on disk as a subfile to the
ZipArchive
. The file named by filename will be read and added to theZipArchive
immediately, but the index will not be updated until you callflush()
. If there already exists a subfile with the indicated name, it is replaced without examining its contents (but see alsoupdate_subfile()
).Returns the subfile name on success (it might have been modified slightly), or empty string on failure.
- add_subfile(subfile_name: str, subfile_data: istream, compression_level: int) str
Adds a file from a stream as a subfile to the
ZipArchive
. The indicated istream will be read and its contents added to the end of the current ZIP file immediately.Note that the istream must remain untouched and unused by any other code until
flush()
is called. At that time, the index of the ZIP archive will be rewritten to the end of the file.Returns the subfile name on success (it might have been modified slightly), or empty string on failure.
- close()
Closes the
ZipArchive
if it is open. All changes are flushed to disk, and the file becomes invalid for further operations until the next call to open().
- static close_read_subfile(stream: istream)
Closes a file opened by a previous call to
open_read_subfile()
. This really just deletes the istream pointer, but it is recommended to use this interface instead of deleting it explicitly, to help work around compiler issues.
- compare_subfile(index: int, filename: Filename) bool
Performs a byte-for-byte comparison of the indicated file on disk with the nth subfile. Returns true if the files are equivalent, or false if they are different (or the file is missing).
If
Filename.set_binary()
or set_text() has already been called, it specifies the nature of the source file. If this is different from the text flag of the subfile, the comparison will always return false. If this has not been specified, it will be set from the text flag of the subfile.
- extract_subfile(index: int, filename: Filename) bool
Extracts the nth subfile into a file with the given name.
- extract_subfile_to(index: int, out: ostream) bool
Extracts the nth subfile to the indicated ostream.
- find_subfile(subfile_name: str) int
Returns the index of the subfile with the indicated name, or -1 if the named subfile is not within the
ZipArchive
.
- flush() bool
Ensures that any changes made to the ZIP archive have been synchronized to disk. In particular, this causes the central directory to be rewritten at the end of the file.
This may result in a suboptimal packing in the ZIP file, especially if existing files were changed or files were removed. To guarantee that the file is as compact as it can be, call
repack()
instead of flush().It is not necessary to call flush() explicitly unless you are concerned about reading the recently-added subfiles immediately.
Returns true on success, false on failure.
- get_comment() str
Returns the comment string that was at the end of the ZIP end-of-directory record, if any. See
set_comment()
.
- get_filename() Filename
Returns the filename of the
ZipArchive
, if it is available.
- get_num_subfiles() int
Returns the number of subfiles within the
ZipArchive
. The subfiles may be accessed in alphabetical order by iterating through [0 .. get_num_subfiles()).
- get_record_timestamp() bool
Returns the flag indicating whether timestamps should be recorded within the
ZipArchive
or not. Seeset_record_timestamp()
.
- get_subfile_internal_length(index: int) int
Returns the number of bytes the indicated subfile consumes within the archive. For compressed subfiles, this will generally be smaller than
get_subfile_length()
; for encrypted (but noncompressed) subfiles, it may be slightly different, for noncompressed and nonencrypted subfiles, it will be equal.
- get_subfile_internal_start(index: int) int
Returns the starting byte position within the
ZipArchive
at which the indicated subfile begins. This may be used, withget_subfile_internal_length()
, for low-level access to the subfile, but usually it is better to useopen_read_subfile()
instead (which automatically decrypts and/or uncompresses the subfile data).
- get_subfile_timestamp(index: int) int
Returns the modification time of the nth subfile. If this is called on an older .zip file, which did not store individual timestamps in the file (or if
get_record_timestamp()
is false), this will return the modification time of the overall ZIP file.
- has_directory(subfile_name: str) bool
Returns true if the indicated subfile name is the directory prefix to one or more files within the
ZipArchive
. That is, theZipArchive
contains at least one file named “subfile_name/…”.
- is_read_valid() bool
Returns true if the
ZipArchive
has been opened for read mode and there have been no errors, and individual Subfile contents may be extracted.
- is_subfile_compressed(index: int) bool
Returns true if the indicated subfile has been compressed when stored within the archive, false otherwise.
- is_subfile_encrypted(index: int) bool
Returns true if the indicated subfile has been encrypted when stored within the archive, false otherwise.
- is_write_valid() bool
Returns true if the
ZipArchive
has been opened for write mode and there have been no errors, and Subfiles may be added or removed from theZipArchive
.
- ls(out: ostream)
Shows a list of all subfiles within the
ZipArchive
.
- needs_repack() bool
Returns true if the
ZipArchive
index is suboptimal and should be repacked. Callrepack()
to achieve this. It is not done automatically.
- open_read(filename: Filename) bool
Opens the named
ZipArchive
on disk for reading. TheZipArchive
index is read in, and the list of subfiles becomes available; individual subfiles may then be extracted or read, but the list of subfiles may not be modified.Also see the version of open_read() which accepts an istream. Returns true on success, false on failure.
- open_read(stream: IStreamWrapper, owns_pointer: bool) bool
Opens an anonymous
ZipArchive
for reading using an istream. There must be seek functionality via seekg() and tellg() on the istream.If owns_pointer is true, then the
ZipArchive
assumes ownership of the stream pointer and will delete it when the ZIP file is closed, including if this function returns false.The given stream must be seekable.
- open_read_subfile(index: int) istream
Returns an istream that may be used to read the indicated subfile. You may seek() within this istream to your heart’s content; even though it will be a reference to the already-opened pfstream of the
ZipArchive
itself, byte 0 appears to be the beginning of the subfile and EOF appears to be the end of the subfile.The returned istream will have been allocated via new; you should pass the pointer to
close_read_subfile()
when you are finished with it to delete it and release its resources.Any future calls to
repack()
orclose()
(or theZipArchive
destructor) will invalidate all currently open subfile pointers.The return value will be NULL if the stream cannot be opened for some reason.
- open_read_write(filename: Filename) bool
Opens the named
ZipArchive
on disk for reading and writing. If there already exists a file by that name, its index is read. Subfiles may be added or removed, and the resulting changes will be written to the named file.Also see the version of open_read_write() which accepts an iostream. Returns true on success, false on failure.
- open_read_write(stream: iostream, owns_pointer: bool) bool
Opens an anonymous
ZipArchive
for reading and writing using an iostream. There must be seek functionality via seekg()/seekp() and tellg()/tellp() on the iostream.If owns_pointer is true, then the
ZipArchive
assumes ownership of the stream pointer and will delete it when the ZIP file is closed, including if this function returns false.
- open_write(filename: Filename) bool
Opens the named
ZipArchive
on disk for writing. If there already exists a file by that name, it is truncated. TheZipArchive
is then prepared for accepting a brand new set of subfiles, which will be written to the indicated filename. Individual subfiles may not be extracted or read.Also see the version of open_write() which accepts an ostream. Returns true on success, false on failure.
- open_write(stream: ostream, owns_pointer: bool) bool
Opens an anonymous
ZipArchive
for writing using an ostream.If owns_pointer is true, then the
ZipArchive
assumes ownership of the stream pointer and will delete it when the ZIP file is closed, including if this function returns false.
- read_subfile(index: int) bytes
Returns a vector_uchar that contains the entire contents of the indicated subfile.
- remove_subfile(index: int)
Removes the nth subfile from the
ZipArchive
. This will cause all subsequent index numbers to decrease by one. The file will not actually be removed from the disk until the next call toflush()
.Note that this does not actually remove the data from the indicated subfile; it simply removes it from the index. The
ZipArchive
will not be reduced in size after this operation, until the next call torepack()
.
- remove_subfile(subfile_name: str) bool
Removes the named subfile from the
ZipArchive
, if it exists; returns true if successfully removed, or false if it did not exist in the first place. The file will not actually be removed from the disk until the next call toflush()
.Note that this does not actually remove the data from the indicated subfile; it simply removes it from the index. The
ZipArchive
will not be reduced in size after this operation, until the next call torepack()
.
- repack() bool
Forces a complete rewrite of the
ZipArchive
and all of its contents, so that the files are tightly packed in the file without any gaps. This is useful to do after removing files, to ensure that the file size is minimized.It is only valid to call this if the
ZipArchive
was opened usingopen_read_write()
and an explicit filename, rather than an iostream. Also, we must have write permission to the directory containing theZipArchive
.Returns true on success, false on failure.
- scan_directory(contents: vector_string, subfile_name: str) bool
Considers subfile_name to be the name of a subdirectory within the
ZipArchive
, but not a file itself; fills the given vector up with the sorted list of subdirectories or files within the named directory.Note that directories do not exist explicitly within a
ZipArchive
; this just checks for the existence of files with the given initial prefix.Returns true if successful, false otherwise.
- set_comment(comment: str)
Sets the string which is appended to the very end of the ZIP archive. This string may not be longer than 65535 characters.
- set_filename(filename: Filename)
Replaces the filename of the
ZipArchive
. This is primarily used for documentation purposes only; changing this name does not open the indicated file. Seeopen_read()
oropen_write()
for that.
- set_record_timestamp(record_timestamp: bool)
Sets the flag indicating whether timestamps should be recorded within the
ZipArchive
or not. The default is true, indicating theZipArchive
will record timestamps for each subfile that is added.If this is false, the
ZipArchive
will not record timestamps internally. In this case, the return value fromget_subfile_timestamp()
will be zero.You may want to set this false to minimize the bitwise difference between independently-generated
ZipArchives
.
- update_subfile(subfile_name: str, filename: Filename, compression_level: int) str
Adds a file on disk to the subfile. If a subfile already exists with the same name, its contents are compared byte-for-byte to the disk file, and it is replaced only if it is different; otherwise, the ZIP file is left unchanged.
Either Filename:::set_binary() or set_text() must have been called previously to specify the nature of the source file. If set_text() was called, the text flag will be set on the subfile.