Atualmente, os únicos erros que este script representa são PermissionError e FileNotFoundError. Certos caracteres não podem ser manipulados corretamente, pois são representados usando sua string de codificação e isso resultou em um FileNotFoundError. Eu adicionei uma exceção KeyboardInterrupt no caso do script estar em execução e você deseja ver os resultados acumulados. O diretório do qual este script foi executado conterá um arquivo chamado differenthashes.txt.
Para executar apenas substitua 'path1' e 'path2' na chamada compare () na parte inferior. Deixe-me saber se você tem alguma sugestão ou não sente isso corretamente para sua necessidade.
import os
import hashlib
import time
def hash(file):
f = open(file,'rb')
h = hashlib.md5()
checkEOF = b' '
while checkEOF != b'':
checkEOF = f.read(1024)
h.update(checkEOF)
f.close()
return h.hexdigest()
def hashwalk(d = './'):
errlist = []
hashes = []
cwd = os.getcwd()
os.chdir(d)
walkobject = os.walk('./')
try:
for directory in walkobject:
dir = directory[0]
files = directory[2]
for file in files:
try:
pathfile = os.path.join(dir,file)
digest = hash(pathfile)
hashes.append((pathfile,digest))
except PermissionError as error:
errlist.append((pathfile,error))
except FileNotFoundError as error:
errlist.append((pathfile,error))
except KeyboardInterrupt:
print('Program terminated, results may be incomplete')
os.chdir(cwd)
return [hashes,errlist]
def compare(path1,path2,logerrors = False):
loc1 = hashwalk(path1)
loc2 = hashwalk(path2)
differenthash = set(loc1[0]).symmetric_difference(set(loc2[0]))
log = open('differenthashes.txt','w',encoding='utf-8')
log.write('path hash date modified\n')
for f,h in sorted(differenthash):
if (f,h) in loc1[0]:
print(path1+'\'+f[2:],h,time.ctime(os.stat(path1+'\'+f[2:]).st_mtime))
log.write(path1 + ' ' +f[2:] + ' ' + h + ' ' + time.ctime(os.stat(path1+'\'+f[2:]).st_mtime)+'\n')
else:
print(path2+'\'+f[2:],h,time.ctime(os.stat(path2+'\'+f[2:]).st_mtime))
log.write(path2 + ' ' +f[2:] + ' ' + h + ' ' + time.ctime(os.stat(path2+'\'+f[2:]).st_mtime)+'\n')
if logerrors:
log.write('\n\n'+path1+' errors\n')
for error in loc1[1]:
log.write(str(error) + '\n')
log.write('\n'+path2+' errors\n')
for error in loc2[1]:
log.write(str(error) +'\n')
log.close()
compare('path1', 'path2' ,logerrors=True)