tft每日頭條

 > 科技

 > 重複文件查找器

重複文件查找器

科技 更新时间:2025-01-09 16:53:30

經常備份手機的照片到PC,如果使用Sync類同步軟件備份不存在文件多次備份問題,如果隻是複制文件到PC,難免有很多文件會多次備份,要整理一下也得花點時間。就想到開發一個查找重複文件的工具,定期掃描一下備份文件夾,删除重複文件。

整個工具的開發思路比較簡單,遍曆目錄,使用SQLite數據庫存儲每個文件路徑及MD5值, 新文件首先計算MD5值,查找數據庫是否存在相同MD5值的文件,如果存在就認位是重複文件,将相關文件信息顯示。如果不存在重複文件,就将文件路徑信息及MD5值加入數據庫。

掃描完成後,根據用戶選擇可以删除選中文件。

重複文件查找器(重複文件查找删除工具開發)1

整體界面設計如上圖所示,比較簡單。這個應用中有幾個重點

  1. 數據庫的使用
  2. 文件列表是通過QTableWidget實現的,文件路徑列實現了一個自定義控件
  3. QTabelWidget中插入控件,獲取控件信息的方法

針對上面幾個重點直接上代碼

  1. 數據庫操作,此處主要是内存數據庫的命名方法

#解決再次打開時提示錯誤 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每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved