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 ...
随机推荐
- Python黑帽编程 3.5 DTP攻击
Python黑帽编程 3.5 DTP攻击 在上一节,<Python黑帽编程 3.4 跨越VLAN>中,我们讨论了一般的VLAN中实施攻击的方法,这一节属于扩展内容,简单演示下Cisco特有 ...
- atom-shell程序打包
上一篇:http://www.cnblogs.com/luobenCode/p/4504910.html 打包之前要准备一下 请看这篇http://www.cnblogs.com/seanlv/arc ...
- json、javaBean、xml互转的几种工具介绍
json.javaBean.xml互转的几种工具介绍 转载至:http://blog.csdn.net/sdyy321/article/details/7024236 工作中经常要用到Json.Jav ...
- Java 对象引用方式 —— 强引用、软引用、弱引用和虚引用
Java中负责内存回收的是JVM.通过JVM回收内存,我们不需要像使用C语音开发那样操心内存的使用,但是正因为不用操心内存的时候,也会导致在内存回收方面存在不够灵活的问题.为了解决内存操作不灵活的问题 ...
- JavaEE:JavaEE技术组成
Java平台版本: JavaSE:Java Platform Standard Edition,标准版,用来开发桌面应用系统: JavaEE:Java Plateform Enterprise Edi ...
- 谈谈php里的DAO Model AR
这次要谈的3个关键字:DAO.Model.AR,是我们在做web应用时常见的几个概念,也被称作设计模式(design pattern),先简单看看它们的全拼和中文: DAO:Data Access O ...
- Entity Framework Code First添加修改及删除外键关联实体
1.添加外键关联实体 1>.添加新的Province及City实体 using (var ctx = new PortalContext()) { var city1 = new City { ...
- jQuery2.0.3源码分析系列之(29) 窗口尺寸
.height() .innerHeight() .innerWidth() .outerHeight() .outerWidth() .width() 基础回顾 一般的,在获取浏览器窗口的大小和位置 ...
- Python第一天 - 迭代
(一)索引迭代 Python中,迭代永远是取出元素本身,而非元素的索引. 如果要取索引可以用enumerate()函数 例: L = ['Adam', 'Lisa', 'Bart', 'Paul'] ...
- Ruby之基础介绍(二)
前言 上一篇我们简单介绍了下Ruby,这一节我们开始正式步入Ruby的世界,一探究竟. Ruby特点 (1)面向对象支持. (2)动态语言:我们可以修改已经定义过的类,也可以为现有类添加实例方法. ( ...