利用python 校驗檔案完整性
阿新 • • 發佈:2018-12-21
方法如下 :
# -*- coding: UTF-8 -*- ###################################### import sys,os import hashlib import binascii import time ###################################### Des_path = r'F:\flycony\Documents' #1 生成md5 2 校驗md5 type = 2 ###################################### def main(path): if type == 1 : creat_md5_file(path) elif type == 2 : verify_md5_file(path) def get_file_md5(file): m = hashlib.md5() with open(file, mode='rb') as f: while True: data = f.read(10240) if not data: break m.update(data) return m.hexdigest().upper() def get_file_sha1(file): m = hashlib.sha1() with open(file, mode='rb') as f: while True: data = f.read(10240) if not data: break m.update(data) return m.hexdigest().upper() def get_file_sha256(file): m = hashlib.sha256() with open(file, mode='rb') as f: while True: data = f.read(10240) if not data: break m.update(data) return m.hexdigest().upper() def get_file_crc32(file): blocksize = 1024 * 64 with open(file, mode='rb') as f: crc = 0 while True: data = f.read(blocksize) if not data: break crc = binascii.crc32(data, crc) return hex(crc)[2:].upper() def get_file_mtime(file): return time.ctime(os.stat(file).st_mtime) def list_current_dir(path): os.chdir(path) dir_list = [] file_list = [] path_list=os.listdir(path) for obj_name in path_list: if os.path.isdir(obj_name): dir_list.append(obj_name) else: file_list.append(obj_name) return (file_list, dir_list) def list_current_dir_allfile(path): os.chdir(path) dir_list = [] file_list = [] path_list=os.listdir(path) for obj_name in path_list: if os.path.isdir(obj_name): dir_list.append(os.path.join(path, obj_name)) else: file_list.append(os.path.join(path, obj_name)) if dir_list: for obj in dir_list: file_list = file_list + list_current_dir_allfile(obj) return file_list def creat_md5_file(path): file_list = list_current_dir_allfile(path) md5_path = path + '.md5' if file_list: for file in file_list: file_md5 = get_file_md5(file) print(file) print('md5 : %s' % file_md5) file_sha256 = get_file_sha256(file) print('sha256 : %s' % file_sha256) md5_file_name = file.replace(path, md5_path) + '.md5' md5_file_path = os.path.dirname(md5_file_name) if not os.path.exists(md5_file_path) : os.makedirs(md5_file_path.encode("utf-8")) with open(md5_file_name, mode= 'w') as f: f.write(file_md5 + '\n' + file_sha256 + '\n') def verify_md5_file(path): file_list = list_current_dir_allfile(path) md5_path = path + '.md5' if file_list: for file in file_list: print(file) md5_file_name = file.replace(path, md5_path) + '.md5' md5_file_path = os.path.dirname(md5_file_name) if not os.path.exists(md5_file_path) : print('The md5 file is not exist !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') break with open(md5_file_name, mode= 'r') as f: file_md5_old = f.readline().strip() file_sha256_old = f.readline().strip() file_md5 = get_file_md5(file) print('md5 : %s' % file_md5) print('md5_original : %s' % file_md5_old) file_sha256 = get_file_sha256(file) print('sha256 : %s' % file_sha256) print('sha256_original : %s' % file_sha256_old) if file_md5 != file_md5_old or file_sha256 != file_sha256_old : print('The file is damage !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') break else: print('verify pass !') #file_path = r'F:\flycony\Downloads\3.00.20回傳\USB\T8000-18 400G\版本\T8000-400.set' #file_md5 = get_file_md5(file_path) #file_sha1 = get_file_sha1(file_path) #file_crc32 = get_file_crc32(file_path) #file_mtime = get_file_mtime(file_path) #file_sha256 = get_file_sha256(file_path) #print(file_mtime) #print(file_crc32) #print(file_md5) #print(file_sha1) #print(file_sha256) # ======================================================== main(Des_path)