- 积分
- 51
- 阳光
-
- 花瓣
-
- 雨露
-
- 节操
-
- 基情
-
- 贡献
-
- 注册时间
- 2015-2-10
- 在线时间
- 小时
- 最后登录
- 1970-1-1
- 阅读权限
- 20
TA的每日心情 | 开心 2015-4-1 14:58 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
本帖最后由 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
|