C#在线更新程序[下载程序、解压缩程序、控制台程序]
【1】下载文件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
namespace XuanWu.Software.EasyInfo.Interface.Update
{
public class DownloadThread
{
#region DownLoadOneFile(下载单个文件)
/// <summary>
/// 下载文件
/// </summary>
/// <param name="url">下载地址</param>
/// <param name="filePath">保存路径</param>
/// <returns></returns>
public bool DownLoadOneFile(string url, string filePath)
{
FileStream fstream = new FileStream(filePath, FileMode.Create, FileAccess.Write);
WebRequest wRequest = WebRequest.Create(url);
try
{
WebResponse wResponse = wRequest.GetResponse();
int contentLength = (int)wResponse.ContentLength;
byte[] buffer = new byte[Properties.Settings.Default.byte_size];
///备注:Properties.Settings.Default.byte_size是从配置文件中读取的
int read_count = 0;
int total_read_count = 0;
bool complete = false;
System.Console.WriteLine("开始下载文件....");
while (!complete)
{
read_count = wResponse.GetResponseStream().Read(buffer, 0, buffer.Length);
if (read_count > 0)
{
fstream.Write(buffer, 0, read_count);
total_read_count += read_count;
if (total_read_count <= contentLength)
System.Console.Write(".");
}
else
{
complete = true;
System.Console.WriteLine("");
System.Console.WriteLine("下载完成!开始安装!");
}
}
fstream.Flush();
return true;
}
catch(Exception ex)
{
throw ex;
}
finally
{
fstream.Close();
wRequest = null;
}
}
#endregion
}
}
【2】解压缩文件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
namespace XuanWu.Software.EasyInfo.Interface.Update
{
public class UnZipClass
{
private byte[] byffer = new byte[Properties.Settings.Default.byte_size];
///备注:Properties.Settings.Default.byte_size是从配置文件中读取的
/// <summary>
/// 有参构造函数
/// </summary>
/// <param name="buffserSize">缓冲大小</param>
public UnZipClass(int buffserSize)
{
byffer = new byte[buffserSize];
}
/// <summary>
/// 无参构造函数
/// </summary>
public UnZipClass()
{ }
/// <summary>
/// 解压缩文件
/// </summary>
/// <param name="zipFilePath">压缩文件路径</param>
/// <param name="unZipFilePath">解压缩文件路径</param>
public void UnZipFile(string zipFilePath, string unZipFilePath)
{
using (ZipInputStream zipstream = new ZipInputStream(File.OpenRead(zipFilePath)))
{
ZipEntry zipEntry = null;
while ((zipEntry = zipstream.GetNextEntry()) != null)
{
string fileName = Path.GetFileName(zipEntry.Name);
if (!string.IsNullOrEmpty(fileName))
{
if (zipEntry.CompressedSize == 0)
break;
using (FileStream stream = File.Create(unZipFilePath + fileName))
{
while (true)
{
int size = zipstream.Read(byffer, 0, byffer.Length);
if (size > 0)
stream.Write(byffer, 0, size);
else break;
}
}
}
}
}
}
/// <summary>
/// 解压缩目录
/// </解压缩目录summary>
/// <param name="zipDirectoryPath">压缩目录路径</param>
/// <param name="unZipDirectoryPath">解压缩目录路径</param>
public void UnZipDirectory(string zipDirectoryPath, string unZipDirectoryPath)
{
using(ZipInputStream zipStream = new ZipInputStream(File.OpenRead(zipDirectoryPath)))
{
ZipEntry zipentry = null;
while ((zipentry = zipStream.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(zipentry.Name);
string fileName = Path.GetFileName(zipentry.Name);
if (!string.IsNullOrEmpty(directoryName))
{
Directory.CreateDirectory(directoryName);
}
if (!string.IsNullOrEmpty(fileName))
{
if (zipentry.CompressedSize == 0)
break;
if (zipentry.IsDirectory)
{
directoryName = Path.GetDirectoryName(unZipDirectoryPath + zipentry.Name);
Directory.CreateDirectory(directoryName);
}
using (FileStream stream = File.Create(unZipDirectoryPath + zipentry.Name))
{
while (true)
{
int size = zipStream.Read(byffer, 0, byffer.Length);
if (size > 0)
stream.Write(byffer, 0, size);
else break;
}
}
}
}
}
}
}
}
【3】控制台应用程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Diagnostics;
using System.IO;
using XuanWu.Software.EasyInfo.Model;
using XuanWu.Software.EasyInfo.Service.elsp_da;
namespace XuanWu.Software.EasyInfo.Interface.Update
{
class Program
{
static void Main(string[] args)
{
Protocol.ProtocolRegister.RegisterProcotols();
string path = "http://" + Properties.Settings.Default.urlServerIP + ":" + Properties.Settings.Default.urlServerPort + "/soft/";
///备注:Properties.Settings.Default.urlServerIP和Properties.Settings.Default.urlServerPort 是从配置文件中读取的
string Version = Properties.Settings.Default.Version; ///版本号
string buildno = Properties.Settings.Default.buildno; ///版本状态
string clienttypeno = Properties.Settings.Default.clienttypeno; ///版本类型
///备注:上面3个变量的赋值都是从配置文件中取的。
try
{
///从本地文件中读取值,如果没有存在文件,报错跳出Try语句.Application.StartupPath + "//Version.bt");
buildno = File.ReadAllText(System.Windows.Forms.Application.StartupPath + "//buildno.bt");
clienttypeno = File.ReadAllText(System.Windows.Forms.Application.StartupPath + "//clienttypeno.bt");
}
catch { }
updatesoftwareobj updatesfoj = getsoftwareobj(Convert.ToInt32(buildno), Convert.ToInt32(Version), Convert.ToInt32(clienttypeno));
///备注:updatesoftwareobj 实体对象
if (updatesfoj != null)
{
path += updatesfoj.updateurl;
int versionstatus = updatesfoj.versionstatus;
string serverVersion = updatesfoj.versionno.ToString();
string serverbuildno = updatesfoj.buildno.ToString();
string serverclienttypeno = updatesfoj.clienttypeno.ToString();
try
{
if (Convert.ToInt32(serverbuildno)> Convert.ToInt32(buildno))
{
System.Console.WriteLine("开始升级....");
System.Console.WriteLine("————————————————————————");
System.Console.WriteLine("开始下载......");
DownloadThread down = new DownloadThread();
down.DownLoadOneFile(path, System.Windows.Forms.Application.StartupPath + "//updata.zip");
System.Console.WriteLine("————————————————————————");
System.Console.WriteLine("开始更新......");
UnZipClass unzip = new UnZipClass();
unzip.UnZipFile(System.Windows.Forms.Application.StartupPath + "//updata.zip", System.Windows.Forms.Application.StartupPath + "//");
unzip.UnZipDirectory(System.Windows.Forms.Application.StartupPath + "//updata.zip", System.Windows.Forms.Application.StartupPath + "//");
File.Delete(System.Windows.Forms.Application.StartupPath + "//updata.zip");
System.Console.WriteLine("更新完成!");
System.Console.WriteLine("————————————————————————");
System.Console.WriteLine("启动服务程序!");
File.WriteAllText(System.Windows.Forms.Application.StartupPath + "//Version.bt", serverVersion);
File.WriteAllText(System.Windows.Forms.Application.StartupPath + "//buildno.bt", serverbuildno);
File.WriteAllText(System.Windows.Forms.Application.StartupPath + "//clienttypeno.bt", serverclienttypeno);
Process.Start(System.Windows.Forms.Application.StartupPath + "//某服务.exe");
}
}
catch (Exception ex)
{
File.WriteAllText(System.Windows.Forms.Application.StartupPath + "//installLog.erroe", ex.ToString());
System.Console.WriteLine(ex.ToString());
}
}
}
/// <summary>
///端版本号及版本号获取是否有相应的更新信息
/// </summary>
/// <param name="buildno"></param>
/// <param name="versionno"></param>
/// <param name="clienttypeno"></param>
/// <returns></returns>
private static updatesoftwareobj getsoftwareobj(int buildno, int versionno, int clienttypeno)
{
DateSourceSystemService datasystesv = new DateSourceSystemService(IPAddress.Parse(Properties.Settings.Default.ServerIP), Properties.Settings.Default.ServerPort);
updatesoftwareobj updatestobj = datasystesv.getbymodelversion(buildno,versionno,clienttypeno);
return updatestobj;
}
}
}
- 顶
C#在线更新程序[下载程序、解压缩程序、控制台程序]的更多相关文章
- VC无窗口控制台程序
VC无窗口控制台程序 #pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartu ...
- Ninject之旅之二:开始使用Ninject(附程序下载)
摘要 这篇文章介绍怎样将Ninject添加到实际的项目中,使用Ninject框架最基本的功能.首先用一个Hello World例子介绍怎么添加和使用Ninject.然后用一个更复杂的例子,介绍Ninj ...
- NHibernate系列文章二十八:NHibernate Mapping之Auto Mapping(附程序下载)
摘要 上一篇文章介绍了Fluent NHibernate基础知识.但是,Fluent NHibernate提供了一种更方便的Mapping方法称为Auto Mapping.只需在代码中定义一些Conv ...
- C#控制台程序的参数解析类库 CommandLine简单使用说明
前言 C#开发的控制台程序,默认接收string[] args参数.如果有多个参数需要输入时,可以按照顺序依次输入:但如果有些参数不是必选的,或者有些参数中间需要有空格比如时间“2016-05-18 ...
- Mac OS X上用CoreCLR运行一个真正的.NET控制台程序
这个真正的控制台程序来自corefxlab,名叫CoreClrHelloWorld,是一个跨平台的.NET控制台演示程序,可以显示微软.Linux.苹果的logo. CoreClrHelloWorld ...
- VC6.0建立控制台程序实现PDA应用
作者:iamlaosong 由于须要,又写起了文本界面的程序,以便PDA通过telnet连上运行. 假设是Linuxserver的话.这是非常easy的事,但是用户server是windows ser ...
- 控制台程序的参数解析类库 CommandLine
C#控制台程序的参数解析类库 CommandLine简单使用说明 前言 C#开发的控制台程序,默认接收string[] args参数.如果有多个参数需要输入时,可以按照顺序依次输入:但如果有些参数不是 ...
- Ninject之旅之十三:Ninject在ASP.NET MVC程序上的应用(附程序下载)
摘要: 在Windows客户端程序(WPF和Windows Forms)中使用Ninject和在控制台应用程序中使用Ninject没什么不同.在这些应用程序里我们不需要某些配置用来安装Ninject, ...
- C#控制台程序使用Log4net日志组件
1.Log4net一般都不陌生,但是在配置上不同类型的项目又不相同的地方比如C#控制台程序和C# MVCWeb项目,拿控制台项目为例 项目源码在文章底部 2.首先创建一个控制台程序,引入Log4n ...
- 使用VSCode如何调试C#控制台程序_1
A-环境安装 https://www.microsoft.com/net/download 下载 .NET Core SDK Installer: https://www.microsoft.com/ ...
随机推荐
- Nginx基础知识之————Nginx 环境的搭建?
本课时主要给大家讲解如何在 Linux 系统下搭建 Nginx 和 Nginx 搭建过程中常见问题的知识,并结合实例让学员掌握 Nginx 环境的搭建. 下载解压: 安装gcc-c++ 从新配置文件: ...
- c 字符串常用函数
#include <iostream> #include <stdio.h> #include <vector> #include "string.h&q ...
- Google MapReduce/GFS/BigTable三大技术的论文中译版
今天查找分布式计算的有关资料,发现Google的三大核心技术MapReduce.GFS和BigTable的论文都已经被翻译成高质量的中文,更巧的是,这三篇中译版的原发地都是CSDN的Blog.其中最新 ...
- Python变量类型
Python变量类型 变量是存储在内存中的值,因此在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定的内存,并决定什么数据可以被存储在内存中. 因此变量可以指定不同的数据类型, ...
- LinuxShell脚本攻略--第一章 小试牛刀
使用 shell 进行数学运算: #!/bin/bash no1=; no2=; let result=no1+no2 echo $result result=$[ $no1 + no2 ] resu ...
- graph-tool 练习
如何使用graph-tool模块,如何导入?如何使用graph,使用其算法? 如何使用Boost Graph库,安装,测试? 1 创建和操纵图 如何创建空图? g = Graph() 如何精准的创建有 ...
- COM组件(MFC篇)
目录 第1章创建进程内组件 1 1.1 目标 1 1.2 创建项目 3 1.2.1 VC++6.0 3 1.2.2 VC++2010 4 1.2.3 VC++6.0与VC ...
- Java客户端通过Http发送POST请求上传文件到web服务器
http://www.cnblogs.com/WilliamJiang/archive/2012/04/29/2475883.html 1.朋友的一个需求,让我给他实现,需求是这样的,需要用ASP.n ...
- 【bzoj1052】覆盖问题
[bzoj1052]覆盖问题 分析 考虑二分\(L\)的值,然后判断3个\(L*L\)能否覆盖所有的点. 这时候出现了两种可能的思路. 思路1 首先,3是一个很小的常数. 我们想:假如能探究出1和2的 ...
- NKW
JavaScript几种原生函数 - 博客频道 - CSDN.NEThttp://blog.csdn.net/h378588270/article/details/12948163 .json_百度搜 ...