You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 03:16:07