搜索
热搜: 活动 交友 discuz
查看: 2537|回复: 4
收起左侧

谢谢更新库,提提小建议

[复制链接]
  • TA的每日心情
    开心
    2015-4-1 14:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-3-27 10:38:40 | 显示全部楼层 |阅读模式
    本帖最后由 daxiadongxin 于 2015-3-27 13:17 编辑

    鱼是我的老乡,很高兴有这么牛的老乡。

    花了几天研究更新库
    低层做得不错,反而是在最后的参数设置和应用层面有点绕。
    前台我完全禁用Instance_UpdatesFound
    但调用鱼的BeginCheckUpdateInProcess,会发现Updater.CreateUpdaterInstance时已经默认绑定了Instance_UpdatesFound
    我的建议是:作为低层的功能,只判断是否存在绑定事件,如果不存在绑定的事件就抛异常,不要主动为用户绑定事件(感觉这个Instance_UpdatesFound把前面做得非常好的松散型的结构一下子搞得死死的)。

    我的前台调用:

            private static void Main()
            {
                Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-CN");

                //BonusSkins.Register();
                //SkinManager.EnableFormSkins();

                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                //

                var myUpdate = new MyUpdate();
                myUpdate.RunUpdate();
                if (myUpdate.IsCancel)
                {
                    return;
                }


           。。。。。
    =====================
        public class MyUpdate
        {

            public bool IsCancel = false;

            public void RunUpdate()
            {
                var updater = Updater.CreateUpdaterInstance(@"http#//dongxnotebook:8011/{0}", "update_c.xml");  因为没有权限在论坛发url,把:改成了#
                var ensureUpdate = new EnsureUpdate();
                var myUpdateFound = new FSLib.App.SimpleUpdater.GaDialogs.UpdateFound();

                updater.RemoveUpdatesFoundDelegate();

                updater.UpdatesFound += (s, e) =>
                {
                    ensureUpdate.Close();

                    myUpdateFound.ShowDialog();
                };

                updater.NoUpdatesFound += (s, e) =>
                {
                    //MessageBox.Show("没有新版本!");
                    ensureUpdate.setCaption("没有新版本!");
                    ensureUpdate.Close();
                };

                updater.UpdateCancelled += (s, e) =>
                {
                    //MessageBox.Show("取消!");
                    //form.Close();
                    //Application.ExitThread();
                    IsCancel = true;
                };

                updater.MinmumVersionRequired += (s, e) =>
                {
                    MessageBox.Show("当前版本过低无法使用自动更新!");
                    IsCancel = true;
                };

                updater.UpdateFinished += (s, e) =>
                {
                    //MessageBox.Show("结束更新!");
                    ensureUpdate.Close();
                };

                updater.Error += (s, e) =>
                {

                    ensureUpdate.Close();
                    if (MessageBox.Show("更新失败,是退出程序还是继续!\n选择是退出,选择否继续。", "", MessageBoxButtons.YesNo) ==

    DialogResult.Yes)
                    {
                        IsCancel = true;
                    }
                };

                updater.Context.EnableEmbedDialog = true;

                updater.BeginCheckUpdateInProcess();

                ensureUpdate.ShowDialog();
            }


    取类库中的Form改了一个主界面myUpdateFound


    ============
    生成配置方面,我认为目的要更明确:
    比如增量更新,现在的作法是不论什么情况都要全部压缩,我感觉不是增量的初忠。
    我改成保持原有的方案,但给用户一个选择:
    在OptionTab加一个checkbox:是否只更新选中的文件:在ListView设置为显示checkbox


    最后的效果:
    可以看到报告增量的是选择的文件
    业务逻辑是“存在最后的压缩文件”&&“设置只更新选中的”&&"选中了"

                    //goldarch:
                    //不处理
                    //if (File.Exists(pkg) && AuProject.SameNoUpdate && projectItems.ContainsKey(file.Key) &&
                    //    !projectItems[file.Key].IsCheck)
                    if (File.Exists(pkg) && AuProject.SameNoUpdate && !config.IsCheck)
                                {
                        //不生成新的包
                                }
                                else
                                {
                                    e.ReportProgress(e.Progress.TaskCount, ++e.Progress.TaskProgress, "正在生成增量包 " + file.Key + ", 正在压缩....");
                                    CreateZip(null, pkg, ui.PackagePassword, null, new[] { file });
                                    Result.Add(pkgFileName, "文件【" + file.Key + "】的增量升级包");                                                
                                }


    而“升级信息文件”还是按原方案自动生成完成信息。最后一步工作:
    在生成的增量压缩文件和更新主信息文件copy到一个专门的文件夹中。这样,如果有更新,只要把这里的增量文件上传到服务器就可以了。


                //goldarch:建立一个临时文件夹存放增量更新的文件
                var c临时文件目录 = Path.Combine(targetDir, "tempbak");
                if (!Directory.Exists(c临时文件目录))
                {
                    Directory.CreateDirectory(c临时文件目录);
                }
                else
                {

                    foreach (string d in Directory.GetFileSystemEntries(c临时文件目录))
                    {
                        if (File.Exists(d))
                            File.Delete(d); //直接删除其中的文件
                    }
                }

    、、=========================================
                    if (File.Exists(pkg) && AuProject.SameNoUpdate && !config.IsCheck)
                                {
                        //不生成新的包
                                }
                                else
                                {
                                        e.ReportProgress(e.Progress.TaskCount, ++e.Progress.TaskProgress, "正在生成增量包 " + file.Key + ", 正在压缩....");
                                        CreateZip(null, pkg, ui.PackagePassword, null, new[] { file });
                        //goldarch:copy一个备份,方便更新
                        File.Copy(pkg, Path.Combine(c临时文件目录, pkgFileName), true);

                                        Result.Add(pkgFileName, "文件【" + file.Key + "】的增量升级包");                                                
                                }

    、、=========================================

    做这个的原因是因为我用的DevExpress的dll库很大,又没有任何变化,但每次都压缩,等待时间太长了。
















    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?入住

    x

    该用户从未签到

    发表于 2015-6-28 07:35:09 | 显示全部楼层
    楼主,你好,请问你有WinForm自动更新的小实例没,我这直接在Main函数里直接加 Updater.CheckUpdateSimple("ftp*//127.0.0.1/Form/{0}", "update_c.xml");  这一句,他一直都不提示更新是什么情况.  改成*号了,不能发链接
    有时间的话,可以发我一个测试的小Demo吗?  [email protected]是我的邮箱.
  • TA的每日心情
    擦汗
    2016-7-22 16:13
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2015-8-28 22:15:36 | 显示全部楼层
    我用木鱼大大的自动更新类 用的一直很稳定的。
    我在客户端是程序里 Program.cs 里加了几句代码,判断 SimpleUpdater.dll 这个文件是否存在,若存在则反射调用。
    上代码吧:
    [C#] 纯文本查看 复制代码
    string updatePath = Application.StartupPath + "\\SimpleUpdater.dll";
    if (System.IO.File.Exists(updatePath))
    {
    	Type type = Assembly.LoadFile(updatePath).GetType("FSLib.App.SimpleUpdater.Updater");
    	MethodInfo md = type.GetMethod("CheckUpdateSimple", new Type[] { typeof(string) });
    	md.Invoke(null, new object[] { "http://127.0.0.1/Update/update_c.xml" });
    }
    

  • TA的每日心情
    开心
    2015-4-1 14:58
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2019-10-11 02:37:27 | 显示全部楼层
    事情过了很久,现在反而是宁愿麻烦,也尽量不动小鱼的代码,道理很简单,直接用多方便啊。
    针对自己曾经的想法,大约是在做测试的时候要重复生成升级文件,感觉太浪费时间。

    后期,如果真的要这么做,也只是做一个工具,在很多文件但只有小量文件更新时,手工替换掉个别文件和更新版本号。
  • TA的每日心情
    奋斗
    2019-1-5 01:55
  • 签到天数: 138 天

    [LV.7]常住居民III

    发表于 2020-5-7 14:16:07 | 显示全部楼层
    。。。。。 我才看到楼主的帖子。。。。
    您需要登录后才可以回帖 登录 | 入住

    本版积分规则

    申请友链| Archiver| 手机版| 鱼·后花园

    GMT+8, 2024-4-23 17:20 , Processed in 0.022610 second(s), 15 queries , Redis On.

    Powered by Discuz! X3.4

    © 2005-2024 鱼·后花园

    快速回复 返回顶部 返回列表