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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:27:39