Python文件完整性监控:遍历父目录子目录计算文件哈希的问题
文件完整性监控器遍历问题修复
你的代码核心问题是文件路径拼接错误:os.walk返回的subdir是当前遍历到的子目录路径,但你用os.path.join(directory, filename)直接拼接父目录和文件名,完全忽略了子目录,导致只会扫描父目录下的文件,子目录里的文件根本无法被正确定位。
修复后的完整代码
import os import hashlib def new_baseline(directory, baseline="baseline.txt"): # 先删除已存在的基线文件 if os.path.exists(baseline): os.remove(baseline) # 用os.walk深度遍历所有子目录和文件 for subdir, _, files in os.walk(directory): for filename in files: # 关键:用当前子目录subdir和文件名拼接正确路径 file_path = os.path.join(subdir, filename) # 跳过无法读取的文件(比如权限问题) if not os.access(file_path, os.R_OK): print(f"无法读取文件:{file_path}") continue # 计算SHA256哈希 file_hash = hashlib.sha256() # 用64KB缓冲区读取大文件,避免内存占用过高 buffer_size = 65536 with open(file_path, 'rb') as f: while chunk := f.read(buffer_size): file_hash.update(chunk) # 写入基线文件(用with自动管理文件关闭) with open(baseline, 'a', encoding='utf-8') as f: line = f"{file_path} | {file_hash.hexdigest()}" f.write(line + '\n') print(line)
关键修改点说明
- 路径拼接:将
os.path.join(directory, filename)改为os.path.join(subdir, filename),这样能正确指向子目录中的文件。 - 文件读取优化:用固定大小的缓冲区读取文件,避免一次性读取大文件导致内存压力。
- 自动文件管理:全程用
with语句处理文件,无需手动调用close(),避免资源泄漏。 - 容错处理:添加
os.access检查文件可读性,跳过无法访问的文件并给出提示。
内容的提问来源于stack exchange,提问作者AerialSong
相关产品推荐
相关产品推荐

