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

对于大的文件,比如大型游戏,下载一般会带有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的库也用了,还是不知道怎么合适地嵌进代码里,不管怎么样,现在起码能验证了。以后再改进吧~

你可能感兴趣的:(数据丢失)