python-cabarchive

class cabarchive.CabArchive(buf: Optional[bytes] = None, flattern: bool = False)

Bases: dict

This instance allows parsing or writing a MS Cabinet archive.

You can treat the CabArchive instance like a dictionary when reading and writing archives.

For instance, loading an archive:

with open("test.cab", "rb") as f:
    arc = CabArchive(f.read())
cff = arc["test.txt"]
print("filename", cff.filename)     # "test.txt"
print("contents", cff.buf)          # b"test123"
print("created", cff.date.year)     # 2015
for fn in arc:
    print(fn)                       # "test.txt"

…or creating and saving an archive:

arc = CabArchive()
arc["test.txt"] = CabFile("test123".encode())
with open("test.cab", "wb") as f:
    f.write(arc.save())
find_file(glob: str) Optional[cabarchive.file.CabFile]

Gets a file from the archive using a glob.

Args:

self: A CabArchive instance. glob: File glob, e.g. *.txt

Returns:

The first CabFile that matches the filename glob, or None.

find_files(glob: str) List[cabarchive.file.CabFile]

Gets files from the archive using a glob.

Args:

self: A CabArchive instance. glob: File glob, e.g. *.txt

Returns:

All CabFile object that matches the filename glob, or None.

parse(buf: bytes) None

Parse .cab binary data

Args:

self: A CabArchive instance. bytes: Binary blob loaded from disk.

Raises:

CorruptionError: The cab file was invalid or corrupt. NotSupportedError: The format was not supported, e.g. unknown compression.

save(compress: bool = False, sort: bool = True) bytes

Returns cabinet file data, optionally compressed

Args:

self: A CabArchive instance. compress: If the binary data should be compressed. sort: If the file lists should be sorted in a predictable order

Returns:

The blob of memory that can be written to disk.

set_id: int

The “Set ID” used for multi-file archives

class cabarchive.CabFile(buf: Optional[bytes] = None, filename: Optional[str] = None, mtime: Optional[datetime.datetime] = None)

Bases: object

An object representing a file in a Cab archive

Any number of CabFile instances can be stored in a CabArchive. A new instance can be created with just the data bytes or with an additional mtime. If the modification time is not set then the current date and time is used, which may be unhelpful if you require a reproducable builds.

cff = CabFile(b"test123")
buf

bytes to use for the file contents

date: Optional[datetime.date]

date the file was created

property filename: Optional[str]

filename to use in the archive

is_arch

set if file modified since last backup

is_exec

set if file is executable

is_hidden

set if file is hidden

is_readonly

set if file is read-only

is_system

set if file is a system file

time: Optional[datetime.time]

time the file was created

exception cabarchive.CorruptionError

Bases: Exception

exception cabarchive.NotSupportedError

Bases: Exception

Indices and tables