C#之tcp自动更新程序

.NETTCP自动更新程序有如下几步骤:
第一步:服务端开启监听
ServiceHost host;
private void button1_Click(object sender, EventArgs e)
{
host = new ServiceHost(typeof(WCFService.Service));
host.Open();
if (host.State == CommunicationState.Opened)
{
this.button1.Enabled = false;
this.button2.Enabled = true;
}
this.label1.Text = host.State.ToString();
}
第二步:客户端创建服务连接,不多说,大家应该都会
第三步:客户端选择更新文件(包括了一个Read_File)
#region 选择文件按钮
private void btn_SelectFiles_Click(object sender, EventArgs e)
{
dt_updatefile.Clear();
OpenFileDialog File_XuanZe = new OpenFileDialog();
File_XuanZe.Multiselect = true;//允许同时选择多个文件
File_XuanZe.Filter = "Dll files(*.dll)|*.dll|Txt files(*.txt)|*.txt|Access files(*.mdb)|*.mdb|All files(*.*)|*.*";
if (DialogResult.OK == File_XuanZe.ShowDialog())
{
for (int i = ; i < File_XuanZe.FileNames.Length; i++)
{
byte[] buff = Read_File(File_XuanZe.FileNames[i]);
//第三列为版本号 应该设置一个textbox为版本号
//第四列为存放路径 例如图片就在图片文件夹,可执行文件就在根目录下
dt_updatefile.Rows.Add(i + , File_XuanZe.SafeFileNames[i], txt_version.Text, @"\图片\", buff);
}
}
dataGridView1.DataSource = dt_updatefile;
}
#endregion #region 将文件转换成byte[] Read_File
public byte[] Read_File(string str_path)
{
byte[] arrFile = null; //先定义一个byte数组
using (FileStream fs = new FileStream(str_path, FileMode.Open, FileAccess.Read)) //path是文件的路径
{
arrFile = new byte[fs.Length];//定义这个byte[]数组的长度 为文件的length
fs.Read(arrFile, , arrFile.Length);//把fs文件读入到arrFile数组中,0是指偏移量,从0开始读,arrFile.length是指需要读的长度,也就是整个文件的长度
return arrFile;
}
}
#endregion
第四步:上传更新文件,采用数据序列化并压缩后上传
#region 上传文件按钮
private void btn_UpdateFile_Click(object sender, EventArgs e)
{
DataSet ds = new DataSet();
if(dt_updatefile.DataSet != null)
{
dt_updatefile.DataSet.Tables.Remove(dt_updatefile);
}
ds.Tables.Add(dt_updatefile);
client.Update_System(data_Serializer.GetDataSetSurrogateZipBytes(ds));
Load_OldFiles();
dt_updatefile.Clear();
}
#endregion
第五步:服务端接受数据并写文件,修改XML中版本信息
#region 接受客户端发来的更新数据包Update_System
public void Update_System(byte[] byte_files)
{
DataSet ds = data_Serializer.GetZipBytesSurrogateDataSet(byte_files);
//解压成了dataset 循环存放文件,并修改Version_Config.xml中对应的值
DataTable dt = ds.Tables[];
foreach(DataRow dr in dt.Rows)
{
string path = System.AppDomain.CurrentDomain.BaseDirectory + @"\" + dr["Col_Version"] +dr["Col_File_Path"];
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
if (File.Exists(path + dr["Col_File_Name"].ToString()))
{
//存在文件
File.Delete(path + dr["Col_File_Name"].ToString());
}
#region 回写文件 没有排除掉重复文件
//判断此文件是否存在,存在则修改为原文件名+年月日时分秒,不存在就写文件
byte[] buffer = (byte[])dr["Col_File_Size"];
FileStream fs = new FileStream(path + dr["Col_File_Name"].ToString(), FileMode.Create, FileAccess.Write);
Stream stream = new MemoryStream((byte[])dr["Col_File_Size"]);
int count = ;
while ((count = stream.Read(buffer, , buffer.Length)) > )
{
fs.Write(buffer, , count);
}
//清空缓冲区
fs.Flush();
//关闭流
fs.Close();
#endregion
//写文件完成了,现在就是修改xml中的值了
configXml.Update_Xml(dr["Col_File_Name"].ToString(), dr["Col_Version"].ToString(), dr["Col_File_Path"].ToString());
}
}
#endregion
第六步:客户端检测版本号,更新程序
#region 下载文件btn_DownFiles_Click
private void btn_DownFiles_Click(object sender, EventArgs e)
{
System.Xml.XmlDocument xDoc = new System.Xml.XmlDocument();
xDoc.Load(System.Windows.Forms.Application.ExecutablePath + ".config");
System.Xml.XmlNode xNode;
System.Xml.XmlElement xElem1;
xNode = xDoc.SelectSingleNode("//appSettings");
xElem1 = (System.Xml.XmlElement)xNode.SelectSingleNode("//add[@key='version']"); DataSet ds = data_Serializer.GetZipBytesSurrogateDataSet(client.DownFiles(ConfigurationManager.AppSettings["version"]));
DataTable dt_file = ds.Tables[];
//linq
Double maxSV = Creat_Version();
foreach (DataRow dr in dt_file.Rows)
{
string path = System.AppDomain.CurrentDomain.BaseDirectory + dr["Col_File_Path"];
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
if (File.Exists(path + dr["Col_File_Name"].ToString()))
{
//存在文件
File.Delete(path + dr["Col_File_Name"].ToString());
}
#region 回写文件 没有排除掉重复文件
//判断此文件是否存在,存在则修改为原文件名+年月日时分秒,不存在就写文件
byte[] buffer = (byte[])dr["Col_File_Size"];
FileStream fs = new FileStream(path + dr["Col_File_Name"].ToString(), FileMode.Create, FileAccess.Write);
Stream stream = new MemoryStream((byte[])dr["Col_File_Size"]);
int count = ;
while ((count = stream.Read(buffer, , buffer.Length)) > )
{
fs.Write(buffer, , count);
}
//清空缓冲区
fs.Flush();
//关闭流
fs.Close();
#endregion
}
//写文件完成了,现在就是修改xml中的值了
xElem1.SetAttribute("value", maxSV.ToString());
xDoc.Save(System.Windows.Forms.Application.ExecutablePath + ".config");
}
#endregion
大致就是以上步骤。具体中的类等信息没有在代码中贴出,可以下载源代码进行研究。
缺陷:
第一:客户端调用没有判断服务是否开启
第二:文件存放路径还没写完整
第三:暂时自己大脑没想到。
源码下载https://yunpan.cn/cSbKnajf63ptA 访问密码 42ac
C#之tcp自动更新程序的更多相关文章
- C#.Net版本自动更新程序及3种策略实现
C#.Net版本自动更新程序及3种策略实现 C/S程序是基于客户端和服务器的,在客户机编译新版本后将文件发布在更新服务器上,然后建立一个XML文件,该文件列举最新程序文件的版本号及最后修改日期.如程序 ...
- ASP.NET网站版本自动更新程序及代码[转]
1.自动更新程序主要负责从服务器中获取相应的更新文件,并且把这些文件下载到本地,替换现有的文件.达到修复Bug,更新功能的目的.用户手工点击更新按钮启动更新程序.已测试.2.环境VS2008,采用C# ...
- WPF自动更新程序
WPF AutoUpdater 描述: WPF+MVVM实现的自动更新程序 支持更新包文件验证(比较文件MD5码) 支持区分x86与x64程序的更新 支持更新程序的版本号 支持执行更新策略 截图: 使 ...
- winform自动更新程序实现
一.问题背景 本地程序在实际项目使用过程中,因为可以操作电脑本地的一些信息,并且对于串口.OPC.并口等数据可以方便的进行收发,虽然现在软件行业看着动不动都是互联网啊啥的,大有Web服务就是高大上的感 ...
- C# WINFORM的自动更新程序
自动更新程序AutoUpdate.exe https://git.oschina.net/victor596jm/AutoUpdate.git 1.获取源码 http://git.oschina.ne ...
- winform 通用自动更新程序
通用自动更新程序 主要功能: 1. 可用于 C/S 程序的更新,集成到宿主主程序非常简单和配置非常简单,或不集成到主程序独立运行. 2. 支持 HTTP.FTP.WebService等多种更新下载方式 ...
- .Net自动更新程序GeneralUpdate,适用于wpf,winfrom,控制台应用
什么是GeneralUpdate: GeneralUpdate是基于.net framwork4.5.2开发的一款(c/s应用)自动升级程序. 第一个版本叫Autoupdate(原博客: WPF自动更 ...
- android自动更新程序,安装完以后就什么都没有了,没有出现安装成功的界面的问题
转载自: http://blog.csdn.net/lovexieyuan520/article/details/9250099 在android软件开发中,总是需要更新版本,所以当有新版本开发的时候 ...
- Winfrom强大的自动更新程序
推荐一:.Net 小型软件自动更新库(SimpAutoUpdater) http://www.fishlee.net/soft/simple_autoupdater/usage.html 下载地址:h ...
随机推荐
- Verlet-js JavaScript 物理引擎
subprotocol最近在Github上开源了verlet-js.地址为https://github.com/subprotocol/verlet-js.verlet-js是一个集成Verlet的物 ...
- 实现Div拖拽
直观的理解div拖拽:当鼠标对着可拖拽部分按住后并拖动,div会跟着鼠标一起运动,并且其运动空间限制在浏览器内部,当放开鼠标时,则div停止运动. 实现div拖拽需要三个重要的事件: (1)onmou ...
- [译]Asp.net MVC 之 Contorllers(二)
URL路由模块 取代URL重写 路由请求 URL路由模块的内部结构 应用程序路由 URL模式和路由 定义应用程序路由 处理路由 路由处理程序 处理物理文件请求 防止路由定义的URL 属性路由 书接上回 ...
- 分享自己写的JS版日期格式化和解析工具类,绝对好用!
前言 本来想模仿Java里面的SimpleDateFormat()对象的,但是感觉这样用起来不方便,所以还是直接写成单独的方法算了. 原文链接 日期格式化 使用说明 formatDate(date, ...
- Java动态编译
程序产生过程 下图展示了从源代码到可运行程序的过程,正常情况下先编译(明文源码到字节码),后执行(JVM加载字节码,获得类模板,实例化,方法使用).本文来探索下当程序已经开始执行,但在.class甚至 ...
- 【原】Python用例:将指定文件或目录打包成zip文件
#This Demo is used to compress files to .zip file #Base on Windows import os import time #The files ...
- 《FaceBook效应》——读后总结
这本书讲述了facebook从如何创建.到风靡全球,并结合facebook的网络效应讲述为什么facebook可以做到社交龙头.读这本书的时候,也可以看看<社交网络>这部电影. faceb ...
- GitFlow
git工作流 始终保持有master分支(只要有目录,git就自动创建)和develop分支(手动创建) 一.主分支Master二.开发分支Develop三.临时性分支(最后发布要删除的)* 功能(f ...
- python 邮件基础篇
python 操作邮件,不是很方便,说实话还不是理解的特别透彻,这次想把自己碰到的东西总结下来 邮件有imap,pop,imap协议,这次使用的是imap4协议,主要用了imap4和mail类, 代码 ...
- Sql Server系列:子查询
1 子查询概念 子查询是嵌套在另一个查询中的普通T-SQL查询.在有一个SELECT语句通过使用小括号创建子查询,作为另一个查询的部分数据或条件的基础. 子查询通常用于满足以下某个需求: ◊ 将一个查 ...