#!/usr/bin/env python3 """ p3_zip.py — Запаковка отредактированного содержимого обратно в ZIP """ import os import zipfile CONTENT_DIR = "hbk_content" STREAMS_DIR = "hbk_streams" zip_streams = ["FileStorage", "PackBlock", "IndexPackBlock"] for name in zip_streams: src_dir = os.path.join(CONTENT_DIR, name) dst_path = os.path.join(STREAMS_DIR, name) if not os.path.isdir(src_dir): print(f" {name}: каталог не найден, пропуск") continue # Собираем список файлов all_files = [] for root, dirs, files in os.walk(src_dir): for fname in files: fpath = os.path.join(root, fname) arcname = os.path.relpath(fpath, src_dir).replace("\\", "/") all_files.append((fpath, arcname)) # Создаём ZIP с теми же параметрами сжатия print(f"\n {name}: запаковка {len(all_files)} файлов...") # Сначала читаем оригинальный ZIP чтобы узнать параметры backup_path = dst_path + ".original" if not os.path.exists(backup_path): # Делаем бэкап оригинала with open(dst_path, "rb") as f: orig_data = f.read() with open(backup_path, "wb") as f: f.write(orig_data) print(f" Бэкап: {backup_path}") # Определяем уровень сжатия из оригинала try: with zipfile.ZipFile(backup_path, "r") as orig_zf: sample = orig_zf.infolist()[0] compress_type = sample.compress_type print( f" Сжатие: {compress_type} " f"({'DEFLATED' if compress_type == 8 else 'STORED'})" ) except: compress_type = zipfile.ZIP_DEFLATED # Собираем новый ZIP with zipfile.ZipFile( dst_path, "w", compression=compress_type, compresslevel=6 ) as zf: for fpath, arcname in sorted(all_files): zf.write(fpath, arcname) new_size = os.path.getsize(dst_path) orig_size = os.path.getsize(backup_path) print(f" Оригинал: {orig_size:>12,} байт") print(f" Новый: {new_size:>12,} байт") diff = new_size - orig_size print(f" Разница: {diff:>+12,} байт") print("\nZIP-потоки перепакованы!")