import os import shutil from pathlib import Path import psutil class DirectoryManager: def __init__(self, config): """ 初始化目录管理器 Args: config: 配置对象,包含输入和输出目录等信息 """ self.config = config def check_disk_space(self): """检查磁盘空间是否足够""" # 获取输入目录大小 input_size = self._get_directory_size(self.config.image_dir) # 获取输入目录所在磁盘的剩余空间 output_drive = os.path.splitdrive( os.path.abspath(self.config.image_dir))[0] if not output_drive: # 处理Linux/Unix路径 output_drive = '/home' disk_usage = psutil.disk_usage(output_drive) free_space = disk_usage.free # 计算所需空间(输入大小的1.5倍) required_space = input_size * 10 if free_space < required_space: error_msg = ( f"磁盘空间不足!\n" f"输入目录大小: {input_size / (1024**3):.2f} GB\n" f"所需空间: {required_space / (1024**3):.2f} GB\n" f"可用空间: {free_space / (1024**3):.2f} GB\n" f"在驱动器 {output_drive}" ) raise RuntimeError(error_msg) def clean_output_dir(self): """清理输出目录""" try: if os.path.exists(self.config.output_dir): shutil.rmtree(self.config.output_dir) print(f"已清理输出目录: {self.config.output_dir}") except Exception as e: print(f"清理输出目录时发生错误: {str(e)}") raise def setup_output_dirs(self): """创建必要的输出目录结构""" try: # 创建主输出目录 os.makedirs(self.config.output_dir) # 创建过滤图像保存目录 os.makedirs(os.path.join(self.config.output_dir, 'filter_imgs')) # 创建日志目录 os.makedirs(os.path.join(self.config.output_dir, 'logs')) print(f"已创建输出目录结构: {self.config.output_dir}") except Exception as e: print(f"创建输出目录时发生错误: {str(e)}") raise def rename_input_dir(self): """修改输入目录,符合ODM要求""" image_dir = Path(self.config.image_dir).resolve() # 原目录名和父路径 parent_dir = image_dir.parent original_name = image_dir.name if not image_dir.exists() or not image_dir.is_dir(): raise ValueError( f"Provided path '{image_dir}' is not a valid directory.") if image_dir.name == "images" and parent_dir == image_dir.parent: # 如果目录已经是 images,直接返回 print(f"输入目录已经是images,无需重命名: {image_dir}") final_images_path = image_dir else: # 新的 images 路径(原目录重命名为 images) images_path = parent_dir / "images" # 重命名原目录为 images image_dir.rename(images_path) # 创建一个新的、和原目录同名的文件夹 new_root = parent_dir / original_name new_root.mkdir(exist_ok=False) # 创建 project 子文件夹 project_dir = new_root / "project" project_dir.mkdir() # 把 images 文件夹移动到 project 下 final_images_path = project_dir / "images" shutil.move(str(images_path), str(final_images_path)) print(f"符合标准输入的文件夹结构已经创建好了,{final_images_path}") return final_images_path.parent.parent def _get_directory_size(self, path): """获取目录的总大小(字节)""" total_size = 0 for dirpath, dirnames, filenames in os.walk(path): for filename in filenames: file_path = os.path.join(dirpath, filename) try: total_size += os.path.getsize(file_path) except (OSError, FileNotFoundError): continue return total_size