【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#在线更新程序[下载程序、解压缩程序、控制台程序]的更多相关文章

  1. VC无窗口控制台程序

    VC无窗口控制台程序 #pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartu ...

  2. Ninject之旅之二:开始使用Ninject(附程序下载)

    摘要 这篇文章介绍怎样将Ninject添加到实际的项目中,使用Ninject框架最基本的功能.首先用一个Hello World例子介绍怎么添加和使用Ninject.然后用一个更复杂的例子,介绍Ninj ...

  3. NHibernate系列文章二十八:NHibernate Mapping之Auto Mapping(附程序下载)

    摘要 上一篇文章介绍了Fluent NHibernate基础知识.但是,Fluent NHibernate提供了一种更方便的Mapping方法称为Auto Mapping.只需在代码中定义一些Conv ...

  4. C#控制台程序的参数解析类库 CommandLine简单使用说明

    前言 C#开发的控制台程序,默认接收string[] args参数.如果有多个参数需要输入时,可以按照顺序依次输入:但如果有些参数不是必选的,或者有些参数中间需要有空格比如时间“2016-05-18 ...

  5. Mac OS X上用CoreCLR运行一个真正的.NET控制台程序

    这个真正的控制台程序来自corefxlab,名叫CoreClrHelloWorld,是一个跨平台的.NET控制台演示程序,可以显示微软.Linux.苹果的logo. CoreClrHelloWorld ...

  6. VC6.0建立控制台程序实现PDA应用

    作者:iamlaosong 由于须要,又写起了文本界面的程序,以便PDA通过telnet连上运行. 假设是Linuxserver的话.这是非常easy的事,但是用户server是windows ser ...

  7. 控制台程序的参数解析类库 CommandLine

    C#控制台程序的参数解析类库 CommandLine简单使用说明 前言 C#开发的控制台程序,默认接收string[] args参数.如果有多个参数需要输入时,可以按照顺序依次输入:但如果有些参数不是 ...

  8. Ninject之旅之十三:Ninject在ASP.NET MVC程序上的应用(附程序下载)

    摘要: 在Windows客户端程序(WPF和Windows Forms)中使用Ninject和在控制台应用程序中使用Ninject没什么不同.在这些应用程序里我们不需要某些配置用来安装Ninject, ...

  9. C#控制台程序使用Log4net日志组件

    1.Log4net一般都不陌生,但是在配置上不同类型的项目又不相同的地方比如C#控制台程序和C# MVCWeb项目,拿控制台项目为例   项目源码在文章底部 2.首先创建一个控制台程序,引入Log4n ...

  10. 使用VSCode如何调试C#控制台程序_1

    A-环境安装 https://www.microsoft.com/net/download 下载 .NET Core SDK Installer: https://www.microsoft.com/ ...

随机推荐

  1. default(T)的含义

    default(T)是泛型中初始化的用法.因为对于泛型T你不知道是值类型还是引用类型,所以传参数是可能会出错.这里就要用到default(T). T t=default(T),就是初始化,值类型的话, ...

  2. JSP连接数据库的两种方式:Jdbc-Odbc桥和Jdbc直连(转)

    学JSP的同学都要知道怎么连数据库,网上的示例各有各的做法,弄得都不知道用谁的好.其实方法千变万化,本质上就两种:Jdbc-Odbc桥和Jdbc直连. 下面先以MySQL为例说说这两种方式各是怎么连的 ...

  3. linux下,一些关于动态库的问题:

    程序运行是加载动态库的几种方法: 第一种,通过ldconfig命令    ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令它,ldconfig命令通 ...

  4. 在Eclipse中设置Java类上面的注释(包含作者、日期等)

    希望在Eclipse中,让Java类上面的注释像下面这样,改如何设置呢? 在Eclipse中,点击菜单中的Window-->Preferences,打开如下窗口:

  5. hiho_1041 国庆出游

    题目 给定一棵树,N个节点,N - 1条边.给定m个节点,能否找出一种遍历方法,使得首次到达节点ai的时间小于首次到达节点aj的时间(i < j).且经过的路径上的每条边都最多走两遍 分析 我的 ...

  6. python语法笔记(五)

    1.python内存管理 (1)对象内存使用 &nsbp;&nsbp;&nsbp;&nsbp;在python中通过执行内建函数 id(obj) 可以获得对象obj在内存 ...

  7. windows redis:Uncaught exception 'RedisException' with message 'Redis server went away'

    window-exe-redis-2.8.12服务,当你复制好php_igbinary.dll,php_redis.dll时候,你运行redis报错:Fatal error: Uncaught exc ...

  8. OneProxy与其它数据库中间件的对比

    OneProxy 优点 性能 缺点 闭源,被商业公司掌控,到时候随别人蹂躏 可维护性极差,缺乏友好的出错信息,光维护这个环节就被他人掌控 定价不明 有没有这样的公司? 大到10wtps,但是没人能理解 ...

  9. GoF--命令设计模式

    定义 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化.用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化.分离变化与不变的因素. 角色 Command ...

  10. H5网页播放器播不了服务器上的mp4视频文件

    打开IIS,在功能视图里找到MIME类型菜单,打开该菜单后鼠标右键添加.mp4扩展名的MIME类型video/mp4 其他视频文件播放不了估计也得在IIS里添加对应的MIME类型(从服务器下载文件时也 ...