經常備份手機的照片到PC,如果使用Sync類同步軟件備份不存在文件多次備份問題,如果隻是複制文件到PC,難免有很多文件會多次備份,要整理一下也得花點時間。就想到開發一個查找重複文件的工具,定期掃描一下備份文件夾,删除重複文件。
整個工具的開發思路比較簡單,遍曆目錄,使用SQLite數據庫存儲每個文件路徑及MD5值, 新文件首先計算MD5值,查找數據庫是否存在相同MD5值的文件,如果存在就認位是重複文件,将相關文件信息顯示。如果不存在重複文件,就将文件路徑信息及MD5值加入數據庫。
掃描完成後,根據用戶選擇可以删除選中文件。
整體界面設計如上圖所示,比較簡單。這個應用中有幾個重點
針對上面幾個重點直接上代碼
#解決再次打開時提示錯誤
if QSqlDatabase.contains('qt_sql_default_connection'):
QSqlDatabase.removeDatabase('qt_sql_default_connection')
#鍊接數據庫,并打開
self.db = QSqlDatabase.addDatabase('QSQLITE')
self.db.setDatabaseName(':memory:')
if not self.db.open():
QMessageBox.warning(None, "提醒", "數據打開失敗,程序退出!")
sys.exit(1)
數據庫,查詢、插入
#創建表
query = QSqlQuery()
query.exec_("""CREATE TABLE fileInfo (
id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
path VARCHAR(255) NOT NULL,
md5 VARCHAR(32) NOT NULL)
""")
#使用MD5算法查重處理
for file in self.list_all_files(self.rootdir):
md5 = self.get_file_md5(file)
#print("%s %s" % (file, md5))
query.exec_("SELECT id, path FROM fileInfo WHERE md5 = '%s'" % md5)
if query.next():
path = query.value(1)
#print(path)
self.signalMsg.emit(['DUPINFO', [path, file]])
else:
#不重複文件信息寫入數據庫
query.prepare("INSERT INTO fileInfo (path, md5) VALUES(:path, :md5)")
query.bindValue(':path', file)
query.bindValue(':md5', md5)
query.exec_()
2.自定義了一個控件,用來顯示兩個重複文件的信息
#!/usr/bin/env python
#-*- encoding=utf-8 -*-
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class DupWidgets(QWidget):
def __init__(self, para:list, parent=None):
super(DupWidgets, self).__init__(parent)
self.param = para
self.setupUI()
#self.show()
def setupUI(self):
self.file1Ckbox = QCheckBox()
self.file1Ckbox.setChecked(False)
self.file1Ckbox.setText('%s' % self.param[0])
self.file2Ckbox = QCheckBox()
self.file2Ckbox.setChecked(True)
self.file2Ckbox.setText('%s' % self.param[1])
layout = QVBoxLayout()
layout.addWidget(self.file1Ckbox)
layout.addWidget(self.file2Ckbox)
self.setLayout(layout)
def getCheckedPathInfo(self):
path = []
if self.file1Ckbox.isChecked():
path.append(self.file1Ckbox.text())
if self.file2Ckbox.isChecked():
path.append(self.file2Ckbox.text())
return path
3.QTableWidget中添加控件,及控件信息獲取的方法
def tableAddItem(self, infoPara:list):
self.dupFilesCnt = 1
if self.dupFilesCnt > self.tableWidget.rowCount():
self.tableWidget.setRowCount(self.tableWidget.rowCount() 1)
row = self.dupFilesCnt - 1
self.tableWidget.setItem(row, 0, QTableWidgetItem("%d"% self.dupFilesCnt))
item = DupWidgets(('%s' % infoPara[0], '%s' % infoPara[1]))
self.tableWidget.setCellWidget(row, 1, item)
def tableGetSelectFile(self):
for row in range(self.dupFilesCnt):
fileList = self.tableWidget.cellWidget(row, 1).getCheckedPathInfo()
yield fileList
這裡獲取選中文件列表的函數中,首先獲取了表格中插入的自定義控件,并調用控件的成員函數返回當前選中文件路徑列表。
到此為止,這個小工具主要代碼如上所示,記錄以備忘。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!