用Python校验下载文件的完整性(md5),游戏之类的大型文件

本文介绍了如何利用Python的MD5校验大型文件的完整性,特别是在下载大型游戏等文件时,通过MD5值可以检查文件是否因网络传输出错而损坏,避免重新下载的困扰。虽然尚未实现进度条功能,但目前的代码已经能够完成基本的文件完整性验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于大的文件,比如大型游戏,下载一般会带有md5值在下载包里面,md5是一种加密手段,在这里可以用来验证完整性,因为在下载大型文件的时候某个部分可能网络传输会出现错误,一个小文件坏了可能会导致游戏玩到中间出意外的bug或者干脆打不开游戏,重新下载要花费很多时间,所以还是值得下好先验证一下的。直接上代码



import hashlib
import os


f_path = input('File path: ')
SETUP_FILE = [file for file in os.listdir(f_path) if os.path.splitext(file)[1] == '.bin' or
              (os.path.splitext(file)[1] == '.exe' and '%' not in os.path.splitext(file)[0])]
MD5_FILE = [file for file in os.listdir(f_path) if os.path.splitext(file)[1] == '.md5']

print('所有安装文件:', SETUP_FILE)
print('MD5储存文件:', MD5_FILE)


def get_correct_md5():
    all_md5 = []

    for file in MD5_FILE:
        with open(os.path.join(f_path, file)) as f:
            data = f.readlines()
        all_md5.extend(data)

    return all_md5

def get_file_md5(file):
    full_file_path = os.path.join(f_path, file)
    m = hashlib.md5()
    file_size = '{:.2f}'.format(os.path.getsize(full_file_path) / (1024 ** 2))
    print('正在验证文件名称:%s, 文件大小:%s Mb' % (file, file_size))
    with open(full_file_path, 'rb') as f:
        while True:
            data = f.read(99999999)
            print('验证速度:%.2f Mb/s' % (len(data) / (1024 ** 2)), end='\r')
            if not data:
                break
            m.update(data)
    file_md5 = m.hexdigest().upper()

    return file_md5


def main():
    all_md5 = get_correct_md5()
    bad_file = 0
    print('开始验证:')
    for file in SETUP_FILE:
        md5 = get_file_md5(file)
        for m in all_md5:
            if file in m:
                m = m.split(' ')
                if md5 == m[0]:
                    print(file, '\n验证通过!\n')
                    break
                else:
                    print(file, '\n文件损坏!\n')
                    bad_file += 1
                    break
        else:
            print('此文件没有找到对应的md5,因此跳过验证。')

    print('所有文件验证完成!')

    if bad_file != 0:
        print('共有 %s 个文件损坏,请重新下载损坏文件!' % bad_file)
    else:
        print('所有文件全部通过验证,可以直接安装!')

    return


main()





一直还想做一个进度条,然而progressbar在win10下好像不是很好用,Python自带的转义符 \r 也用得不是很好,此外比如tqdm的库也用了,还是不知道怎么合适地嵌进代码里,不管怎么样,现在起码能验证了。以后再改进吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值