1. 程式人生 > >利用python 校驗檔案完整性

利用python 校驗檔案完整性

方法如下 :

# -*- 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)