zoukankan      html  css  js  c++  java
  • c/s 自动升级(WebService)

    首先声明,本人文笔不好,大家见笑,请高手不要吐槽.

    做c/s开发肯定会遇到的就是自动升级功能,而这实现方式是非常多. 本文使用 webservice的方式来提供升级服务

      


    首先准备服务

    为了方便我们专门用一个文件夹来存放需要更新的应用程序

    因为觉得通过新版本来更新很麻烦,所以验证文件是否需要更新用md5来判断

    WebService:

    复制代码
     public string GetVer()
            {
                DirectoryInfo dir = new DirectoryInfo(Server.MapPath("update"));
                var list = new List<object>();
                var url = string.Format("http://{0}:{1}/update/", HttpContext.Current.Request.Url.Host,
                                        HttpContext.Current.Request.Url.Port);
    
                DirectoryInfoHelper.SetDirectoryInfo(dir, list, url, "");
                JavaScriptSerializer json = new JavaScriptSerializer();
                return json.Serialize(list);
            }
    复制代码

    相关方法:

    复制代码
    public static void SetDirectoryInfo(DirectoryInfo dir, List<object> list, string url, string dirName)
            {
                foreach (var file in dir.GetFiles())
                {
                    FileStream fs = File.OpenRead(file.FullName);
                    list.Add(new { file.Name, Md5 = Security.GetMd5(fs), LocalHost = url, Directory = dirName });
                    fs.Close();
                }
                foreach (var dirInfo in dir.GetDirectories())
                {
                    SetDirectoryInfo(dirInfo, list, url, string.Format("{0}{1}/", dirName, dirInfo.Name));
                }
            }
    复制代码

    说明:1.不想将模型,而服务端只需要提供数据,所以采用匿名对象

           2.GetVer服务返回信息中 包含 文件名,md5值,域名地址,该文件上级目录


    C/S:

    先看界面

    现在就跟着提示消息走吧.

    1.获取服务文件特征

    调用webservice获取文件信息

    复制代码
    private List<VerMd5Date> GetServerData()
            {
                AutoUpdate.Update update = new AutoUpdate.Update();
                var json = update.GetVer();
                var list = AppCode.JsonHelper.JsonDeserialize<VerMd5Dates>(json);
                return list;
            }
    复制代码

    客户端需要反序列化json 所以建了一个对应model

    复制代码
    public class VerMd5Date
        {
            public string Name { get; set; }
            public string Md5 { get; set; }
            public string LocalHost { get; set; }
            public string Directory { get; set; }
        }
        class VerMd5Dates : List<VerMd5Date>
        {
        }
    复制代码

    反序列化:

    复制代码
     /// <summary>
            /// 反序列化json
            /// </summary>
            /// <typeparam name="T">对象</typeparam>
            /// <param name="jsonString">json字符串</param>
            public  static T JsonDeserialize<T>(string jsonString)
            {
                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
                MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
                T obj = (T)ser.ReadObject(ms);
                return obj;
            }
    复制代码

    2.获取本地文件特征

    复制代码
    private List<VerMd5Date> GetLocalData(List<string> serverNames)
            {
                DirectoryInfo dir = new DirectoryInfo(Application.StartupPath);
                var list = new List<VerMd5Date>();
                DirectoryInfoHelper.GetDirectoryInfo(dir, list,"",serverNames);
                return list;
            }
    复制代码

    相关方法:

    复制代码
    public static void GetDirectoryInfo(DirectoryInfo dir, List<VerMd5Date> list, string dirName, List<string> serverNames)
            {
                foreach (var file in dir.GetFiles().Where(m=>serverNames.Contains(dirName+m.Name)))
                {
                    using (FileStream fs = File.OpenRead(file.FullName))
                    {
                        list.Add(new VerMd5Date
                            {
                                Name = file.Name,
                                Directory = dirName,
                                Md5 = Security.GetMd5(fs)
                            });
                    }
                }
                foreach (var dirInfo in dir.GetDirectories())
                {
                    GetDirectoryInfo(dirInfo, list, string.Format("{0}{1}/", dirName, dirInfo.Name), serverNames);
                }
            }
    复制代码

    说明:serverNames 是服务器文件名集合,主要用来排除本地文件夹中非本程序文件

    3.对比文件差异

    复制代码
    private List<VerMd5Date> EqualsList(List<VerMd5Date> list, List<VerMd5Date> localList)
            {
                var getList = new List<VerMd5Date>();
                foreach (var ver in list)
                {
                    var file = localList.FirstOrDefault(m => m.Name == ver.Name && m.Directory == ver.Directory);
                    if (file == null)
                    {
                        getList.Add(ver);
                    }
                    else
                    {
                        if (file.Md5 != ver.Md5 && file.Directory == ver.Directory)
                        {
                            getList.Add(ver);
                        }
                    }
                }
                return getList;
            }
    复制代码

    4.下面就开始下载吧

    foreach (var file in _getList)
                {
                    SetItem(string.Format("正在下载 {0}{1}", file.Directory, file.Name));
                    DownloadFile(file.LocalHost, file.Directory, file.Name, progressBar1);
                }
    DownloadFile:
     View Code

    下载方式有很多,这里已经有了文件的下载地址,下载代码大家就尽情发挥.有什么好的方式也告诉我一下,非常感谢

    运行截图

    基本上就完了.请高手不要吐槽啊.

     源码地址:http://pan.baidu.com/share/link?shareid=656896785&uk=2215622930

  • 相关阅读:
    bzoj 1017 魔兽地图DotR
    poj 1322 chocolate
    bzoj 1045 糖果传递
    poj 3067 japan
    timus 1109 Conference(二分图匹配)
    URAL 1205 By the Underground or by Foot?(SPFA)
    URAL 1242 Werewolf(DFS)
    timus 1033 Labyrinth(BFS)
    URAL 1208 Legendary Teams Contest(DFS)
    URAL 1930 Ivan's Car(BFS)
  • 原文地址:https://www.cnblogs.com/soundcode/p/3288798.html
Copyright © 2011-2022 走看看