# +====================================================================== # | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] # +---------------------------------------------------------------------- # | Copyright (c) 2021-2026 小蚂蚁云团队 版权所有 # +---------------------------------------------------------------------- # | 开源协议: Apache-2.0 # | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。 # +---------------------------------------------------------------------- # | 官方网站: https://www.djangoadmin.cn # +---------------------------------------------------------------------- # | 研发团队: 小蚂蚁云团队 荣誉出品 # +====================================================================== # | 版权和免责声明: # | 一、知识产权声明 # | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、 # | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权, # | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。 # | 二、使用限制与禁止条款 # | 您理解并同意,禁止将本产品用于以下任何行为: # | 1. 任何违反中华人民共和国法律法规的用途; # | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为; # | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。 # | 三、责任豁免 # | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失 # | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三 # | 方提起索赔或行政机关进行调查,您应独立承担全部责任。 # | 四、违约与法律责任 # | 如发现任何违反本声明的行为,本团队有权: # | 1. 无条件配合公安机关及其他有权机关的调查取证工作; # | 2. 依法追究相关方的民事责任,并要求赔偿全部损失; # | 3. 保留进一步采取刑事控告等法律措施的权利。 # | 五、许可范围说明 # | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包 # | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通 # | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、 # | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造 # | 成的一切经济损失及商誉损害。 # | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件 # | 许可协议》附件为准。 # +====================================================================== """ 文件目录操作工具模块 ============================================================= 该模块提供文件和目录操作的常用工具函数。 主要用于处理文件上传、目录创建、路径管理等场景,确保文件系统操作的 安全性和可靠性。包含目录创建、文件操作等基础功能。 主要功能: 1. 递归创建目录(mkdir)- 确保目标目录存在 2. 文件路径处理 3. 目录存在性检查 所属包: utils 所在文件: utils/file_utils.py 依赖模块: os - 操作系统接口模块 """ import os def mkdir(path): """ 递归创建目录 ============================================================= 检查指定路径的目录是否存在,如果不存在则递归创建所有必需的目录。 用于确保文件上传等操作前目标目录已存在。 参数: path (str): 需要创建/检查的目录路径 返回: bool: True - 目录创建成功或已存在 False - 目录创建失败(保留扩展用) 使用示例: >>> # 确保上传目录存在 >>> upload_dir = '/data/uploads/2024/01' >>> mkdir(upload_dir) /data/uploads/2024/01 创建成功 True 注意事项: 1. 函数会自动创建多级不存在的目录 2. 如果目录已存在,不会重复创建 3. 需要有相应的文件系统权限 """ # 去除首位空格 # 说明:消除用户输入中可能包含的前后空格,避免路径错误 path = path.strip() # 去除尾部 \ 符号 # 说明:Windows系统路径可能以\结尾,去除后保持路径格式统一 path = path.rstrip("\\") # 判断路径是否存在 # 函数:os.path.exists(path) # 说明:检查指定路径的文件或目录是否存在 isExists = os.path.exists(path) if not isExists: # 如果不存在则创建目录 # 函数:os.makedirs(path) # 说明:递归创建目录,如果中间目录不存在也会一并创建 # 例如:创建 /a/b/c 时,如果 /a 和 /a/b 都不存在,会一并创建 os.makedirs(path) print(path + ' 创建成功') return True else: # 如果目录存在则不创建,并提示目录已存在 # 说明:目录已存在是正常情况,不需要重复创建 print(path + ' 目录已存在') return False # ======================= 扩展:常用文件操作工具类 ========================== class FileUtils: """ 文件操作工具类 ============================================================= 提供更多常用的文件和目录操作功能,封装为类方法便于调用。 包含文件读写、路径处理、文件信息获取等实用功能。 使用示例: >>> # 获取文件大小 >>> size = FileUtils.get_file_size('/path/file.txt') >>> print(f"{size} bytes") >>> # 安全删除文件 >>> if FileUtils.safe_delete('/path/file.txt'): ... print("文件删除成功") """ @staticmethod def get_file_size(file_path): """ 获取文件大小 ============================================================= 参数: file_path (str): 文件路径 返回: int: 文件大小(字节),如果文件不存在返回0 """ if os.path.exists(file_path) and os.path.isfile(file_path): return os.path.getsize(file_path) return 0 @staticmethod def get_file_extension(filename): """ 获取文件扩展名 ============================================================= 参数: filename (str): 文件名或文件路径 返回: str: 文件扩展名(小写),例如:'.jpg', '.txt' """ import os return os.path.splitext(filename)[1].lower() @staticmethod def get_file_name_without_ext(filename): """ 获取不带扩展名的文件名 ============================================================= 参数: filename (str): 文件名或文件路径 返回: str: 不带扩展名的文件名 """ import os return os.path.splitext(os.path.basename(filename))[0] @staticmethod def safe_delete(file_path): """ 安全删除文件 ============================================================= 参数: file_path (str): 文件路径 返回: bool: True - 删除成功或文件不存在 False - 删除失败(如权限不足) """ try: if os.path.exists(file_path) and os.path.isfile(file_path): os.remove(file_path) return True except Exception as e: print(f"文件删除失败: {e}") return False @staticmethod def read_file(file_path, encoding='utf-8'): """ 读取文件内容 ============================================================= 参数: file_path (str): 文件路径 encoding (str): 文件编码,默认utf-8 返回: str/None: 文件内容字符串,读取失败返回None """ try: with open(file_path, 'r', encoding=encoding) as f: return f.read() except Exception as e: print(f"文件读取失败: {e}") return None @staticmethod def write_file(file_path, content, encoding='utf-8', mode='w'): """ 写入文件内容 ============================================================= 参数: file_path (str): 文件路径 content (str): 要写入的内容 encoding (str): 文件编码,默认utf-8 mode (str): 写入模式,'w'覆盖写入,'a'追加写入 返回: bool: True - 写入成功,False - 写入失败 """ try: # 确保目录存在 directory = os.path.dirname(file_path) if directory and not os.path.exists(directory): os.makedirs(directory) with open(file_path, mode, encoding=encoding) as f: f.write(content) return True except Exception as e: print(f"文件写入失败: {e}") return False @staticmethod def list_files(directory, pattern=None): """ 列出目录下的所有文件 ============================================================= 参数: directory (str): 目录路径 pattern (str): 文件匹配模式,如 '*.txt',None表示所有文件 返回: list: 文件名列表 """ import glob if not os.path.exists(directory): return [] if pattern: search_path = os.path.join(directory, pattern) return [os.path.basename(f) for f in glob.glob(search_path)] else: return [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))] @staticmethod def get_file_info(file_path): """ 获取文件详细信息 ============================================================= 参数: file_path (str): 文件路径 返回: dict: 包含文件信息的字典,文件不存在返回None """ if not os.path.exists(file_path) or not os.path.isfile(file_path): return None stat = os.stat(file_path) return { 'name': os.path.basename(file_path), 'path': os.path.abspath(file_path), 'size': stat.st_size, 'size_format': FileUtils._format_size(stat.st_size), 'extension': FileUtils.get_file_extension(file_path), 'created_time': stat.st_ctime, 'modified_time': stat.st_mtime, 'is_hidden': os.path.basename(file_path).startswith('.') } @staticmethod def _format_size(size_bytes): """ 格式化文件大小显示 ============================================================= 参数: size_bytes (int): 文件大小(字节) 返回: str: 格式化后的大小字符串,如 '1.5 MB' """ if size_bytes < 1024: return f"{size_bytes} B" elif size_bytes < 1024 * 1024: return f"{size_bytes / 1024:.2f} KB" elif size_bytes < 1024 * 1024 * 1024: return f"{size_bytes / (1024 * 1024):.2f} MB" else: return f"{size_bytes / (1024 * 1024 * 1024):.2f} GB" # ======================= 便捷函数封装 ========================== def get_file_size(file_path): """获取文件大小(字节)的便捷函数""" return FileUtils.get_file_size(file_path) def safe_delete(file_path): """安全删除文件的便捷函数""" return FileUtils.safe_delete(file_path) def get_file_extension(filename): """获取文件扩展名的便捷函数""" return FileUtils.get_file_extension(filename)