一、实现思路
源文件
:①被复制的文件(一般在客户端自身PC上);②被下载的文件;(一般在服务器上)。
缓存文件
:正在粘贴/下载获取中的文件,粘贴/下载完成前,一般是不完整的缓存类文件。
二、代码示例(供参考,下载/复制任务执行函数省略)
import threading
import time
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import *
from PyQt5.QtCore import pyqtSignal
from spys02 import Ui_Form_SPYS
import socket
from ftplib import FTP
import os
import glob
class ui_main(QMainWindow, Ui_Form_SPYS):
show_progress = pyqtSignal(int)
def __init__(self):
super(ui_main, self).__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.Update_detection)
self.show_progress.connect(self.updateProgress)
def download_file(self):
'''执行下载/复制任务'''
pass
def showProgress(self,remote_file: str, local_file: str):
'''
显示进度条
:param remote_file: 被下载的文件
:param local_file: 保存在本地的文件
:return:
'''
#进度条对话框
self.progress = QProgressDialog("从服务器下载中...", "取消", 0, 100, self)
self.progress.setWindowTitle('进度')
self.progress.setAutoClose(True)
self.progress.setAutoReset(True)
self.progress.setMinimumDuration(0)
self.progressValue = 0
#执行下载任务
t = threading.Thread(target=lambda:self.download_file(remote_file,local_file))
t.start()
#更新下载进度条
while t.is_alive():
QApplication.processEvents() # 处理其他事件
self.show_progress.emit(1)
time.sleep(0.5)
self.progress.setValue(100) # 确保进度达到100
# 下载/复制完成提示
c = QMessageBox.question(self, '更新', f'{remote_file}下载完成,是否打开?', QMessageBox.Yes | QMessageBox.No,
QMessageBox.No)
def updateProgress(self):
#根据待下载.exe的大小与本地正在下载的.exe大小,更新下载进度
local_file_size = self.get_local_file_size(local_file)
remote__file_size = self.get_local_file_size(remote_file)
progressValue = int((local_file_size / remote__file_size ) * 100)
self.progress.setValue(progressValue)
def get_local_file_size(self,file_path):
'''
获取本地文件大小
:param file_path:
:return: .exe文件大小
'''
if os.path.isfile(file_path):
file_size = os.path.getsize(file_path)
return file_size/1024
else:
return 0
def get_ftp_file_size(self,file_path):
'''
获取ftp服务器上文件的大小的方式
:param file_path:
:return:
'''
size = self.ftp.size(file_path)
return size/1024
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = ui_main()
window.show()
sys.exit(app.exec_())
三、系列文章参考
《PyQt程序:实现新版本的自动更新检测及下载(FTP服务器实现)》