python
import tarfile
from pathlib import Path
from compression.zstd import ZstdFile, CompressionParameter
def compress_folder(src_folder: str, output_file: str, level: int = 9):
"""
将 src_folder 文件夹压缩为一个 .tar.zst 文件
:param src_folder: 待压缩的文件夹路径
:param output_file: 输出的压缩文件路径,例如 'archive.tar.zst'
:param level: 压缩级别 (1-22,默认22为最高,速度越慢)
"""
src_path = Path(src_folder)
if not src_path.is_dir():
raise NotADirectoryError(f"{src_folder} 不是一个有效的文件夹")
# 打开 zstd 压缩文件(以二进制写模式),并指定压缩级别
with ZstdFile(output_file, mode="wb",
options={CompressionParameter.compression_level: level}) as zf:
# 在 zstd 压缩流之上再包一层 tar 归档,实现"打包+压缩"
with tarfile.open(fileobj=zf, mode="w|") as tar:
tar.add(src_path, arcname=src_path.name)
print(f"压缩完成: {output_file}")
def decompress_folder(archive_file: str, dest_folder: str = "."):
"""
解压 .tar.zst 文件到指定目录
:param archive_file: 压缩文件路径,例如 'archive.tar.zst'
:param dest_folder: 解压目标目录,默认当前目录
"""
Path(dest_folder).mkdir(parents=True, exist_ok=True)
with ZstdFile(archive_file, mode="rb") as zf:
with tarfile.open(fileobj=zf, mode="r|") as tar:
tar.extractall(path=dest_folder) # Python 3.14 默认使用安全过滤器 filter="data"
print(f"解压完成,文件已还原到: {dest_folder}")
if __name__ == "__main__":
# compress_folder("C:/Users/zhoull/Downloads/ebook", "C:/Users/zhoull/Downloads/ebook.tar.zst", level=9)
decompress_folder("C:/Users/zhoull/Downloads/ebook.tar.zst", "D:/output_folder")