一、简介:

实现方式为使用哈希值对比文件是否重复,应用场景有越积越大的下载空间。

二、界面:

去重界面.png

三、部分源码:

1.需要的包:

  1. import os#操作文件夹及删除文件需要
  2. import hashlib#哈希计算需要
  3. #import binascii#转16进制需要,当然可以不转
  4. from tkinter import *#UI需要
  5. from tkinter import messagebox#弹个窗
  6. from tkinter import filedialog#选择路径需要
  7. import tkinter.font as tkFont#字体设置
  8. import tkinter.ttk#进度条需要

2.UI实现:

  1. window = Tk()# 创建主窗口
  2. #window.attributes("-topmost",1)#置顶
  3. ft = tkFont.Font(family='SourceHanSansCN-Bold',size=8)#设置字体和字号
  4. window.title('重复文件删除工具')# 窗口命名为归档工具
  5. screenWidth = window.winfo_screenwidth() # 获取显示区域的宽度
  6. screenHeight = window.winfo_screenheight() # 获取显示区域的高度
  7. width = 500# 设定窗口宽度
  8. height = 250# 设定窗口高度
  9. left = (screenWidth - width) / 2#距左
  10. top = (screenHeight - height) / 2#距上
  11. window.geometry("%dx%d+%d+%d" % (width,height,left,top))#设置窗口为720*480且居中初始化
  12. window.resizable(width=False, height=False)#不可调整大小
  13. #window.iconbitmap('HASHlogo.ico')# 更改窗口图标
  14. #window['background']='green'#设置背景颜色
  15. window.attributes("-alpha",0.8)# 窗口透明度
  16. Label(window,text = "version:RC 1.0 ©wUw\nwuwofcproject.com\nwww.yuque.com/u2205738",font=ft).place(relx = 0.35,rely = 0.8)
  17. def select_folder1():
  18. # 单个文件选择
  19. selected_folder1 = filedialog.askdirectory() # 选择路径
  20. varF_1.set(selected_folder1)
  21. varF_1 = StringVar()
  22. LF_1 = Label(window,text = "选择整理路径:",font=ft).place(relx = 0.05,rely = 0.15)
  23. EnF_1 = Entry(window, textvariable = varF_1).place(relx = 0.21,width = 280,rely = 0.15)
  24. Button(window, text="选择路径", command=select_folder1,font=ft).place(relx =0.78,width = 80,rely = 0.15)
  25. btn = Button(window,text = "去重",font=ft,command = lambda:[delfile()]).place(relx = 0.88,rely = 0.8)
  26. btn = Button(window,text = "查重",font=ft,command = lambda:[inspect()]).place(relx = 0.78,rely = 0.8)
  27. progressbarTwo = tkinter.ttk.Progressbar(window) # 设置进度条
  28. progressbarTwo.place(relx=0.05, width=450, height=7, rely=0.65) # 设置进度条长宽高
  29. progressbarOne = tkinter.ttk.Progressbar(window) # 设置进度条
  30. progressbarOne.place(relx=0.05, width=450, height=7, rely=0.55) # 设置进度条长宽高
  31. window.mainloop()#保持窗口

3.大文件划块计算哈希值:

  1. with open(listA[i], 'rb', buffering=0) as f: # 二进制读取文件
  2. print(i)
  3. sha224 = hashlib.sha224() # 哈希 sha224
  4. while True:
  5. IV00 = f.read(8192) # 一次读取8192,分段读取,直至读取完毕
  6. sha224.update(IV00) # 拼接
  7. # print(IV00)
  8. if not IV00:
  9. break
  10. # print(sha224.hexdigest())
  11. listB.append(sha224.hexdigest()) # 将sha224哈希值写入listB
  12. progressbarOne['value'] += 1 # 进度值+1
  13. window.update()

4.哈希值对比:

  1. # 开始对比文件哈希值是否相同↓
  2. num0 = 0
  3. while num0 < len(listB):
  4. for x in range(num0 + 1, len(listB)):
  5. # print('.', x)
  6. if listB[num0] == listB[x]:
  7. listD.append(listA[x])
  8. num0 += 1
  9. listD = list(set(listD))
  10. # 对比到此结束,并去除重复↑

5.删除文件及留痕:

  1. # 将去除的文件写入txt↓
  2. file = open(varF_1.get() + '\\del flie.txt', 'w')
  3. file.write('\n'.join(listD))
  4. # 删除文件↓
  5. for z in listD:
  6. if os.path.exists(z):
  7. os.remove(z)
  8. progressbarTwo['value'] = 2
  9. messagebox.showinfo("通知(Tips)", "完成!")#弹出结束通知
  10. os.startfile(varF_1.get() + '\\del flie.txt')#打开文件

四、软件包:https://prodbb45198-pic10.ysjianzhan.cn/upload/delfilerb.rar