90 lines
2.8 KiB
Python
90 lines
2.8 KiB
Python
|
|
import os
|
||
|
|
import hashlib
|
||
|
|
|
||
|
|
class FileReader:
|
||
|
|
"""
|
||
|
|
实现01-文件读取.md描述的 file_reader 模块。
|
||
|
|
|
||
|
|
功能描述:
|
||
|
|
- 支持流式读取大文件,不阻塞内存。
|
||
|
|
- 校验文件存在性及可读性。
|
||
|
|
- 实时计算总大小和SHA-256哈希值。
|
||
|
|
"""
|
||
|
|
|
||
|
|
def __init__(self, file_path: str, chunk_size: int = 1 * 1024 * 1024):
|
||
|
|
"""
|
||
|
|
A[接收文件路径 + 卷大小]
|
||
|
|
|
||
|
|
Args:
|
||
|
|
file_path (str): 目标文件的路径。
|
||
|
|
chunk_size (int): 单次读取的数据块大小(字节),默认1MB。
|
||
|
|
"""
|
||
|
|
self.file_path = file_path
|
||
|
|
self.chunk_size = chunk_size
|
||
|
|
|
||
|
|
# B["文件存在 / 可读 ?"] -> 校验节点
|
||
|
|
if not os.path.exists(file_path):
|
||
|
|
raise FileNotFoundError(f"文件不存在: {file_path}")
|
||
|
|
|
||
|
|
if not os.access(file_path, os.R_OK):
|
||
|
|
raise PermissionError(f"无读权限: {file_path}")
|
||
|
|
|
||
|
|
def __iter__(self):
|
||
|
|
# C["打开二进制流"]
|
||
|
|
self._total_size = 0
|
||
|
|
self._sha256_hash = hashlib.sha256()
|
||
|
|
|
||
|
|
with open(self.file_path, 'rb') as f:
|
||
|
|
while True:
|
||
|
|
chunk = f.read(self.chunk_size)
|
||
|
|
|
||
|
|
# E["EOF ?"] -> 检查文件是否结束
|
||
|
|
if not chunk:
|
||
|
|
break
|
||
|
|
|
||
|
|
# 更新元数据状态 (对应F节点输出的元信息)
|
||
|
|
self._total_size += len(chunk)
|
||
|
|
self._sha256_hash.update(chunk)
|
||
|
|
|
||
|
|
yield chunk
|
||
|
|
|
||
|
|
@property
|
||
|
|
def total_size(self) -> int:
|
||
|
|
"""返回文件总大小"""
|
||
|
|
return self._total_size
|
||
|
|
|
||
|
|
@property
|
||
|
|
def sha256_hash(self) -> str:
|
||
|
|
"""返回SHA-256哈希值"""
|
||
|
|
return self._sha256_hash.hexdigest()
|
||
|
|
|
||
|
|
|
||
|
|
# --- 使用示例 (Usage Example) ---
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
try:
|
||
|
|
# 初始化读取器
|
||
|
|
reader = FileReader("kali-2026.zip", chunk_size=1024*1024)
|
||
|
|
|
||
|
|
print(f"开始读取...")
|
||
|
|
total_chunks = 0
|
||
|
|
|
||
|
|
# D/E/F节点逻辑:遍历数据流并模拟下游处理
|
||
|
|
for data_chunk in reader:
|
||
|
|
# 此处模拟传递给 crypto 加密引擎
|
||
|
|
# process_crypto_engine(data_chunk)
|
||
|
|
|
||
|
|
total_chunks += 1
|
||
|
|
|
||
|
|
# 可选:实时查看进度 (实际工程中通常由外部状态管理模块处理)
|
||
|
|
print(f"已读取第 {total_chunks} 块数据,当前大小: {reader.total_size} bytes")
|
||
|
|
|
||
|
|
print("-" * 30)
|
||
|
|
print(f"文件读取完毕。")
|
||
|
|
print(f"总大小: {reader.total_size} bytes")
|
||
|
|
print(f"SHA-256: {reader.sha256_hash}")
|
||
|
|
|
||
|
|
except Exception as e:
|
||
|
|
# B节点报错处理
|
||
|
|
print(f"读取失败: {e}")
|