58 lines
1.9 KiB
Python
58 lines
1.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
'''
|
|
@File : file_utils.py
|
|
@Time : 2025/12/27 17:14:29
|
|
@Author : wty-yy
|
|
@Version : 1.0
|
|
@Blog : https://wty-yy.github.io/
|
|
@Desc : Common File Utilities
|
|
'''
|
|
import tarfile
|
|
import shutil
|
|
import os
|
|
from pathlib import Path
|
|
import logging
|
|
|
|
def log_msg(logger: logging.Logger, msg: str, level: str):
|
|
if logger:
|
|
getattr(logger, level)(msg)
|
|
else:
|
|
print(msg)
|
|
|
|
def compress_directory(source_dir, output_filename=None, delete_original=True, logger: logging.Logger=None):
|
|
"""
|
|
Compress a directory into a .tar.xz file using LZMA compression.
|
|
|
|
Args:
|
|
source_dir (str | Path): Path to the directory to compress.
|
|
output_filename (str | Path, optional): Output path. Defaults to source_dir + ".tar.xz".
|
|
delete_original (bool): Whether to delete the source directory after successful compression.
|
|
"""
|
|
source_dir = Path(source_dir)
|
|
if not source_dir.exists():
|
|
log_msg(logger, f"⚠️ Source directory for compression not found: {source_dir}", "warning")
|
|
return
|
|
|
|
if output_filename is None:
|
|
output_filename = source_dir.with_suffix('.tar.xz')
|
|
else:
|
|
output_filename = Path(output_filename)
|
|
|
|
log_msg(logger, f"📦 Compressing logs: {source_dir.name} -> {output_filename.name} ...", "info")
|
|
|
|
try:
|
|
with tarfile.open(output_filename, "w:xz") as tar:
|
|
tar.add(source_dir, arcname=source_dir.name)
|
|
|
|
log_msg(logger, f"✅ Compression finished: {output_filename}", "info")
|
|
|
|
if delete_original:
|
|
shutil.rmtree(source_dir)
|
|
log_msg(logger, f"🗑️ Deleted original directory: {source_dir}", "info")
|
|
|
|
except Exception as e:
|
|
log_msg(logger, f"❌ Failed to compress directory {source_dir}: {e}", "error")
|
|
# If compression failed, ensure we don't leave a half-baked file
|
|
if output_filename.exists():
|
|
os.remove(output_filename)
|