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