如何获取Windows共享文件夹文件的MD5校验值?pysmb实现遇重复问题求方案
解决pysmb读取Windows共享文件后MD5校验值一致的问题
问题原因
你的代码中,conn.retrieveFile将共享文件内容写入临时文件file_obj后,文件指针停留在文件末尾。此时直接调用file_obj.read()会读取到空字节,导致hashlib.md5()没有接收到任何文件数据,最终所有文件都返回空内容的MD5值(通常是d41d8cd98f00b204e9800998ecf8427e),这就是所有文件校验值相同的核心原因。
解决方案
方案1:重置临时文件指针到开头
在计算哈希前,将临时文件的指针移回文件起始位置,就能正常读取文件内容:
import tempfile import hashlib from smb.SMBConnection import SMBConnection conn = SMBConnection(userName, password, config.clientMachineName, serverName, use_ntlm_v2=True) conn.connect(host, 139) file_obj = tempfile.NamedTemporaryFile() file_attributes, filesize = conn.retrieveFile(share_name, file_path, file_obj) # 关键操作:将文件指针移至文件开头 file_obj.seek(0) # 计算MD5哈希 md5_hash = hashlib.md5() while True: data = file_obj.read(1024) if not data: break md5_hash.update(data) print(file_path, md5_hash.hexdigest()) # 关闭临时文件释放资源 file_obj.close()
方案2:直接在下载过程中计算哈希(推荐)
无需创建临时文件,自定义一个可写入对象,在retrieveFile下载文件的同时更新哈希值,既节省磁盘空间又提升效率:
import hashlib from smb.SMBConnection import SMBConnection class HashUpdater: def __init__(self, hash_obj): self.hash_obj = hash_obj def write(self, data): # 写入数据的同时更新哈希 self.hash_obj.update(data) # 建立SMB连接 conn = SMBConnection(userName, password, config.clientMachineName, serverName, use_ntlm_v2=True) conn.connect(host, 139) # 初始化MD5哈希对象和自定义写入器 md5_hash = hashlib.md5() hash_writer = HashUpdater(md5_hash) # 下载文件时直接同步计算哈希 file_attributes, filesize = conn.retrieveFile(share_name, file_path, hash_writer) print(file_path, md5_hash.hexdigest())
这个方案适合处理大文件,避免临时文件占用磁盘空间,同时减少了一次磁盘读取操作,性能更优。
内容的提问来源于stack exchange,提问作者Gary
相关产品推荐
相关产品推荐

