C# 自动更新(基于FTP)

目录

一、前言

二、功能的实现

1.本地黑名单

2.读取配置文件

3.读取 FTP 文件列表

4.读取本地文件

5.匹配更新

6.版本的切换

三、环境搭建

1.搭建 IIS 版 FTP 服务器

2.防火墙

3.FTP 登陆测试

1)使用浏览器

2)使用文件管理器

四、常见问题

问题1:界面不动

问题2:公网FTP下载文件错误

五、更新说明

2023.12.30 更新

2024.06.18 更新

2024.06.20 更新

结束


效果

启动软件后,会自动读取所有的 FTP 服务器文件,然后读取本地需要更新的目录,进行匹配,将 FTP 服务器的文件同步到本地

Winform 界面

一、前言

在去年,我写了一个 C# 版本的自动更新,这个是根据配置文件 + 网站文件等组成的框架,以实现本地文件的新增、替换和删除,虽然实现了自动更新的功能,但用起来过于复杂,代码量也比较大,改起来困难,后面我就想能不能弄一个 FTP 服务器进行版本的更新。平时客户端版本的更新,一般就两个需求,1.将服务器端最新的文件同步到本地,2.版本回退,如果当前版本有bug,可以随意的切换想要的版本号,这个功能在 FTP 服务器实现起来也比较简单,在 FTP 服务器里新建一个对应版本的文件夹,把对应版本的文件放进去就好了,想切换那个版本,就把 FTP 链接地址指向这个文件夹,然后同步到本地就好了,知道了这个原理,那么就来实现吧。

二、功能的实现

新建一个 winform 项目,界面如下(旧版)

这几个控件分别是文件名,文件下载的进度,下载进度的百分比,具体控件名可以在源码中查看

软件在启动后,就会自动进行文件匹配,判断那些文件是否需要更新,但在做之前,需要先做几件事

1.本地黑名单

本地的有些文件是不必参与到更新的,比如将 update.exe 这个文件放在更新目录的,而且当前已经打开,总不能自己删除自己吧,所有有关 update.exe 相关的文件都不能参与到更新中,另一个,其他一些不需要参与到更新的文件都可以添加到黑名单中。

2.读取配置文件

ftp 的链接地址,用户名和密码,这些都是不能在代码中写死的,我一般写在配置文件中,如果你不想用户名和密码被别人看见,也比较简单,单独写一个程序集,将用户名,密码等写到一个类中,然后用我的教程中的 C# 代码混淆加密的方式把 dll 加密就行了,在 Visual Studio 2022 中反编译也是看不到的,而且,其他的反编译软件也是没用的,但是在程序运行时,用户名和密码是可以正常的读出来的。

我当前配置文件中的 用户名、密码、ftp服务器链接,主程序名 如下所示

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
    </startup>

	<appSettings>
		<add key="FtpUrl" value="ftp://127.0.0.1//"/>
		<add key="FtpUser" value="user"/>
		<add key="FtpPassword" value="123456"/>
		<add key="MainProgram" value="CNCMain"/>
	</appSettings>
</configuration>

3.读取 FTP 文件列表

在这里,我一次性将 FTP 链接中对应目录的所有文件的 文件名,文件大小,文件哈希值,文件路径,文件夹,包含子目录文件,都读出来了,这样就没必要和之前一样,单独去搞配置文件了。

4.读取本地文件

读取本地文件是为了判断哪些文件需要替换,删除,那些文件夹需要创建,删除,总之就是让客户端这边需要更新的文件和服务器一样,没有多余的文件,也能够保持所有的文件是最新的版本。

5.匹配更新

有了 FTP 服务器对应目录的文件数据,也有了本地目录的所有文件数据,接下来就是进行匹配了,找出哪些需要创建的文件夹,需要删除的文件夹,需要更新的文件,需要删除的文件,这里匹配文件的用法依然使用哈希值匹配。

using System.Collections.Generic;

internal class UpdateResultInfo
{
    /// <summary>
    /// 需要创建的文件夹列表
    /// </summary>
    public List<string> CreateFolderList { get; set; } = new List<string>();
    /// <summary>
    /// 需要删除的文件夹列表
    /// </summary>
    public List<string> DeleteFolderList { get; set; } = new List<string>();

    /// <summary>
    /// 本地需要更新的文件列表
    /// </summary>
    public List<DownloadFileInfo> LocalUpdateFileList { get;set; } = new List<DownloadFileInfo>();
    /// <summary>
    /// 本地需要删除的文件列表
    /// </summary>
    public List<FileInfo> LocalDeleteFileList { get; set; } = new List<FileInfo>();
}

这里会单独写一个方法来得出想要的结果,然后由单独的方法去处理这些结果。

下面是控制台效果,不喜欢也可以去掉,由于本地只有 update.exe 文件,而 update.exe 又在黑名单中,所以默认会把 ftp 服务器对应目录的所有文件下载下来,如果服务器文件和客户端文件是一样的,那么这个文件是不会下载的,这个我经过测试,是没问题的。

效果(旧版)

界面效果(旧版)

6.版本的切换

版本的切换也比较简单,在配置文件中,改对应的链接就好了,客户端就会自动和服务器对应的版本进行对比了。

比如:

ftp://127.0.0.1//v1.0.1
ftp://127.0.0.1//v1.0.2
ftp://127.0.0.1//v1.0.3

那么关于 FTP 自动更新的流程就是这个样子了,上面的功能,都是经过各种测试,花了一些时间写出来的,流程是可以走的通的,有兴趣的朋友也可以自己写写看,感觉 FTP 版,要比我之前写的 HTTP 版的要简单很多。

代码我并没有全部贴出来,有需要的可以去支持一下我,在此谢谢了,有源码有疑问的可以私信我,我看到后会回复的。

源码地址:点击下载

三、环境搭建

1.搭建 IIS 版 FTP 服务器

参考帖子:

【Windows】之搭建 FTP 服务器_windows搭建ftp服务器-CSDN博客

虽然框架是可用的,但还是要注意以下几点:

1.FTP服务器搭建完成后,如果你的电脑IP地址变了,记得更改,否则客户端会访问不了。

2.FTP 文件夹名字,尽量不要用空格,因为在访问的时候,是一个链接形式进行访问的,链接中有空格可能会导致无法访问。

查看 FTP 的链接地址:

2.防火墙

在使用之前,FTP服务端电脑一定要保证客户端的电脑能 ping 的通

如果你不想关闭防火墙,那么就需要其他的设置,来保证通信的白名单,这个在运维领域有相关的教程

3.FTP 登陆测试

为了检测 FTP 是否能连接的上,最好先在文件管理器和网页进行测试,下面我都演示下。

1)使用浏览器

在浏览器输入:ftp://192.168.30.83/(你自己的FTP服务器地址),注意 ip 地址后面使用的是单斜杠

然后回车,就会弹框,让你输入用户名和密码

这时候,输入你创建 FTP用的 windows 账号就行了。

输入完成,就能看到你的 FTP 服务器文件了

2)使用文件管理器

使用文件管理器操作差不多,输入地址,按回车就行了

输入账号和密码

打开了 FTP 的根目录,说明 FTP 服务器正常使用。

四、常见问题

问题1:界面不动

如果界面一直停留在这个界面不动,一般情况是配置文件中的 FTP 地址,账号和密码配置出了问题,这时候,首先检查配置文件的数据是否正确。

旧版的提示界面:

如果还是无法读取 FTP 服务器的文件,那就先在浏览器中查看 FTP 服务器是否能连接上,如果 FTP 服务器中能连接,那么就把源码复制到客户端中,用 Visual Studio 2022 进行打开断点查看,一般来说,在浏览器中能查看 FTP 服务器,当前软件也可以连接的上。

问题2:公网FTP下载文件错误

这个问题在 2024.06.18 版本中已中解决,如果您目前用的是 2023.12.30 版本,请下载最新的版本

五、更新说明

2023.07.25 添加了本地黑名单文件夹功能

2023.12.30 进行了大幅度的优化,同时改动了一部分功能,具体更新内容参考帖子 

2024.01.5 优化了部分代码

2024.01.13 优化了部分代码

2023.12.30 更新

针对当前的源码进行大量优化,两个项目对比:

除优化外,同时删除了一部功能,改动如下:

1.项目从 Winform 改成了控制台应用

2.配置文件从 App.config 里读取,改为读取自定义的配置文件 ftpAccount.config

3.修复了本地黑名单文件和黑名单文件夹内文件重复下载问题

4.匹配文件算法重写

5.去掉了删除本地多余的文件夹和文件功能(除了要更新的文件,其他文件和文件夹都不会被删除)

6.将黑名单文件和黑名单文件夹的读取放入到了本地的 txt 文件中,如下:

黑名单和黑名单文件夹一样,文件夹直接写文件夹名字,文件的话要加后缀,比如 xxx.exe,用换行作为区分

当前的源码如果遇到 bug 或者有更好的建议,欢迎私信或者评论,我会改正过来,然后更新资源文件,谢谢。

2024.06.18 更新

针对 23.12.30 代码进一步优化,主要解决在公网 FTP 服务器(UNIX/Linux FTP 服务器)无法下载文件的 bug,同时对网友建议,添加了 Winform 界面,如下:

另外,由于 UNIX/Linux FTP 服务器 无法再用以前的方式去读取哈希值,匹配文件的方式我改为了 MD5 匹配。

解决方案如下:

对于之前网友建议的使用根据 FTP 文件的修改日期和文件大小去判断是否需要更新,我测试了一下,也行不通,我在文件管理器中打开 FTP 服务器,我将本地文件复制到进去,但你复制的文件在 FTP 服务器中就变成你复制的日期,所以根本无法匹配。这个方式唯一可以实现的就是在你的电脑上搭建一个 IIS 版的 FTP 服务器,那文件的修改日期就不会变,但是问题又来了,假设文件的大小是1字节,你在 txt 文件中写入 a 和 b 都占用1字节,所以这种方式也是行不通。

2024.06.20 更新

添加了一个新的项目,用来生成 FTP 文件的配置文件,来解决读取 FTP MD5 读取过慢的问题,因为在线读取 MD5 其实就是下载 FTP 文件到本地的缓存中,然后从缓存中进行获取的,它和下载 FTP 文件到本地的速度差不。在配置文件的读取方面,我是直接读取这个配置文件的字符串,如果返回为空,那么就执行在线读取 MD5 值,在局域网测试也挺快的,但切换到公网服务器,那速度简直是灾难,和蜗牛似的。生成工具界面如下:

项目中的配置文件使用的都是 txt 和 config 格式文件,也没对内容进行加密,如果你需要加密和自定义文件的格式,请根据源代码自行修改。

源码地址:点击下载

结束

如果这个帖子对你有所帮助,欢迎 关注 + 点赞 + 留言

end

  • 18
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 32
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊思宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值