PyQt程序:实现新版本的自动更新检测及下载(FTP服务器实现)

发布于:2024-04-19 ⋅ 阅读:(33) ⋅ 点赞:(0)

一、实现逻辑

本实例采用相对简单的逻辑实现,用户在客户端使用软件时点击“检测升级”按钮,连接至FTP服务器检索是否有新版本的·.exe,如果有,下载最新的.exe安装升级。

在这里插入图片描述
在这里插入图片描述

本实例服务端待下载.exe所在目录结构
在这里插入图片描述
本实例客户端待更新.exe所在目录结构
在这里插入图片描述

二、搭建服务器

可以参考我的这篇博客:《二、Cpolar 内网穿透 FileZilla :避开所有坑点》

三、程序实现

01.FTP连接相关程序

提供以下功能:
①FTP服务器的连接,需要输入FTP服务器的域名、端口号、用户名、密码。
②从FTP服务器获取规定用户可以访问的文件目录。
③从FTP服务器下载指定的文件。
④获取FTP服务器上指定文件的大小。
⑤获取FTP服务器/客户端 的软件版本号。

ftp_tools.py

import socket
from ftplib import FTP
import os
import glob

class LinkFTP:
    """
    连接 FTP 服务器
    """
    def __init__(self, host: str, port: int, username: str, password: str):
        self.ftp = self.login_ftp(host,port,username,password)

    # 登录FTP服务器
    def login_ftp(self, host: str, port: int, username: str, password: str):

        timeout = 60
        socket.setdefaulttimeout(timeout)
        ftp = FTP()
        # 设置为被动模式,必须设置,不然即使连接到服务器也无法读取文件
        ftp.set_pasv(True)

        ftp.encoding = 'utf-8'  # 'gbk'
        ftp.connect(host, port)
        ftp.login(username, password)
        #打印欢迎信息,服务端设置
        print(ftp.welcome)
        return ftp

    def path_list(self,path: str) -> list:

        # 切换路径
        self.ftp .cwd(path)
        # 显示目录下所有目录信息
        self.ftp .dir()
        # 获取目录下的文件夹
        dir_list: list = self.ftp.nlst()
        # 排序
        dir_list.sort()
        return dir_list

    def Update_detection(self,remote_path: str, local_path: str):
        '''

        :param remote_path: 远程服务器 .exe文件所在文件路径
        :param local_path: 本地 .exe文件所在路径
        :return:
        '''
        #本地文件夹
        if not os.path.exists(local_path):
            os.makedirs(local_path)

        # ftp切换到.exe所在的文件路径
        self.ftp.cwd(remote_path)
        # 获取exe所在的文件路径目录列表
        dir_list = self.ftp.nlst()
        # print(dir_list)

        symbol = 0
        '''
            symbol = 0:需要更新
            symbol = 1:已经是最新,不需要更新
            symbol = 2:版本号一致,但文件不完整(下载中断时),需要更新
            symbol = 3:远程服务器指定文件夹没有.exe文件,无需更新
        ''