This commit is contained in:
2026-09-12 10:26:08 +08:00
parent 2548231e88
commit faa046bec9
12 changed files with 2950 additions and 3 deletions
+342
View File
@@ -0,0 +1,342 @@
# +======================================================================
# | 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)