protected override void BuilderFailed(AuProject project, Exception exception, UpdateInfo resultUpdateInfo) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("更新项目构建失败:" + exception.Message); Console.ResetColor(); base.BuilderFailed(project, exception, resultUpdateInfo); }
/// <summary> /// 重新绑定数据 /// </summary> /// <param name="project"></param> void RebindDefaultUpdateMethodInfo(AuProject project) { switch (project.DefaultUpdateMethod) { case UpdateMethod.Always: rbAlways.Checked = true; break; case UpdateMethod.VersionCompare: rbVersionCheck.Checked = true; break; case UpdateMethod.SkipIfExists: rbOnlyNotExist.Checked = true; break; case UpdateMethod.Ignore: rbIgnore.Checked = true; break; default: break; } lblCheckTypeDesc.Text = project.DefaultUpdateMethod == UpdateMethod.VersionCompare ? project.DefaultFileVerificationLevel.ToDisplayString() : "点击选项时选择比较类型"; }
void BindProject(AuProject project) { var ui = project.UpdateInfo; _project = project; chkUseIncreaseUpdate.AddDataBinding(project, s => s.Checked, s => s.EnableIncreaseUpdate); chkCompressUpdateInfo.AddDataBinding(project, s => s.Checked, s => s.CompressPackage); chkCreateCompatiblePackage.AddDataBinding(project, s => s.Checked, s => s.CreateCompatiblePackage); chkAutoCloseSucceed.AddDataBinding(ui, s => s.Checked, s => s.AutoCloseSucceedWindow); chkAutoCloseFailed.AddDataBinding(ui, s => s.Checked, s => s.AutoCloseFailedDialog); nudTimeoutFailed.Value = ui.AutoCloseFailedTimeout; nudTimeoutSucceed.Value = ui.AutoCloseSucceedTimeout; this.deletePreviousFileMode.SelectedIndex = (int)ui.DeleteMethod; this.deleteRules.Text = ui.DeleteFileLimits.IsEmpty() ? "" : string.Join(Environment.NewLine, ui.DeleteFileLimits); txtPackagePassword.AddDataBinding(ui, s => s.Text, s => s.PackagePassword); requiredMinVersion.AddDataBinding(ui, s => s.Text, s => s.RequiredMinVersion); project.PropertyChanged += (s, e) => { if (e.PropertyName == "DefaultUpdateMethod" || e.PropertyName == "DefaultFileVerificationLevel") { RebindDefaultUpdateMethodInfo(s as AuProject); } }; RebindDefaultUpdateMethodInfo(project); }
/// <summary> /// 打开 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void btnOpen_Click(object sender, EventArgs e) { var open = new OpenFileDialog() { Title = "打开升级信息文件", Filter = "XML信息文件(*.xml)|*.xml" }; if (open.ShowDialog() != DialogResult.OK) { return; } var file = open.FileName; var project = AuProject.LoadFromOldProject(file); if (project != null) { UpdatePackageBuilder.Instance.AuProject = project; } else { Information("无法打开指定的文件 " + file + " !"); } }
/// <summary> /// 构建项目 /// </summary> /// <param name="filepath"></param> public virtual void Build(string filepath) { var builder = Builder; var project = AuProject.LoadFile(filepath); if (project == null) { BuilderFailed(null, new ApplicationException(SR.UnableOpenProject), null); return; } builder.AuProject = project; Project = project; var bgw = new BackgroundWorker(); bgw.DoWork += (s, e) => builder.Build(e); bgw.WorkFailed += (s, e) => BuilderFailed(project, e.Exception, builder.BuiltUpdateInfo); bgw.WorkCompleted += (s, e) => BuildSuccess(project, builder.Result, builder.BuiltUpdateInfo); bgw.WorkerProgressChanged += (s, e) => UpdateProgress(e.Progress); builder.FilePackagingBegin += (sender, args) => { ZipTasks = builder.AllPackageBuildTasks; OnFilePackingBegin(); }; builder.FilePackagingEnd += (sender, args) => OnFilePackingEnd(); OnWorkerInitialized(); bgw.RunWorkASync(); }
/// <summary> /// 重新绑定数据 /// </summary> /// <param name="project"></param> void RebindDefaultUpdateMethodInfo(AuProject project) { rbAlways.Checked = Utility.HasMethod(project.DefaultUpdateMethod, UpdateMethod.Always); rbVersionCheck.Checked = Utility.HasMethod(project.DefaultUpdateMethod, UpdateMethod.VersionCompare); rbOnlyNotExist.Checked = Utility.HasMethod(project.DefaultUpdateMethod, UpdateMethod.SkipIfExists); rbIgnore.Checked = Utility.HasMethod(project.DefaultUpdateMethod, UpdateMethod.Ignore); chkSkipIfNotExist.Checked = Utility.HasMethod(project.DefaultUpdateMethod, UpdateMethod.SkipIfNotExist); lblCheckTypeDesc.Text = Utility.HasMethod(project.DefaultUpdateMethod, UpdateMethod.VersionCompare) ? project.DefaultFileVerificationLevel.ToDisplayString() : "点击选项时选择比较类型"; }
void BindProject(AuProject project) { Root = project.ParseFullPath(project.DestinationDirectory); project.PropertyChanged += (s, ee) => { if (ee.PropertyName == "ApplicationDirectory") Root = project.ParseFullPath(project.ApplicationDirectory); }; Root = project.ParseFullPath(project.ApplicationDirectory); }
void upb_ProjectClosed(object sender, PackageEventArgs e) { chkUseIncreaseUpdate.DataBindings.Clear(); chkCreateCompatiblePackage.DataBindings.Clear(); chkCompressUpdateInfo.DataBindings.Clear(); txtPackagePassword.DataBindings.Clear(); requiredMinVersion.DataBindings.Clear(); chkAutoCloseSucceed.DataBindings.Clear(); chkAutoCloseFailed.DataBindings.Clear(); _project = null; }
void BindProject(AuProject project) { Root = project.ParseFullPath(project.DestinationDirectory); project.PropertyChanged += (s, ee) => { if (ee.PropertyName == "ApplicationDirectory") { Root = project.ParseFullPath(project.ApplicationDirectory); } }; Root = project.ParseFullPath(project.ApplicationDirectory); }
void OpenProject(string path) { var project = AuProject.LoadFile(path); if (project == null) { Information("打开项目时出错!"); return; } UpdatePackageBuilder.Instance.AuProject = project; }
/// <summary> /// 清理目标目录 /// </summary> void CleanTargetDirectory() { var directory = AuProject.ParseFullPath(AuProject.DestinationDirectory); //删除 update*.xml foreach (var file in Directory.GetFiles(directory, "update*.xml")) { File.Delete(file); } //删除package foreach (var file in Directory.GetFiles(directory, "*." + AuProject.PackageExtension)) { File.Delete(file); } }
protected override void BuildSuccess(AuProject project, Dictionary<string, string> packages, UpdateInfo resultUpdateInfo) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("更新项目构建成功"); Console.WriteLine("==============================="); Console.ForegroundColor = ConsoleColor.Yellow; var index = 0; foreach (var package in packages) { Console.WriteLine("[{0:#0000}] {1} {2}", ++index, package.Key, package.Value); } Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("==============================="); Console.WriteLine("已构建 {0} 个包。", packages.Count); Console.ResetColor(); base.BuildSuccess(project, packages, resultUpdateInfo); }
protected override void BuildSuccess(AuProject project, Dictionary <string, string> packages, UpdateInfo resultUpdateInfo) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("更新项目构建成功"); Console.WriteLine("==============================="); Console.ForegroundColor = ConsoleColor.Yellow; var index = 0; foreach (var package in packages) { Console.WriteLine("[{0:#0000}] {1} {2}", ++index, package.Key, package.Value); } Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("==============================="); Console.WriteLine("已构建 {0} 个包。", packages.Count); Console.ResetColor(); base.BuildSuccess(project, packages, resultUpdateInfo); }
/// <summary> /// 自动从绑定的信息中绑定信息 /// </summary> public void AutoLoadInformations() { if (AuProject == null) { return; } //自动取版本号 if (!string.IsNullOrEmpty(AuProject.VersionUpdateSrc)) { var path = AuProject.ParseFullPath(AuProject.VersionUpdateSrc); if (File.Exists(path)) { UpdateInfo.AppVersion = ExtensionMethod.ConvertVersionInfo(System.Diagnostics.FileVersionInfo.GetVersionInfo(path)).ToString(); } } //自动读取更新记录 if (!string.IsNullOrEmpty(AuProject.UpdateContentSrc)) { var path = AuProject.ParseFullPath(AuProject.UpdateContentSrc); if (File.Exists(path)) { UpdateInfo.Desc = File.ReadAllText(path); } } //准备UpdateInfo if (!string.IsNullOrEmpty(AuProject.UpdateRtfNotePath)) { var path = AuProject.ParseFullPath(AuProject.UpdateRtfNotePath); if (File.Exists(path)) { UpdateInfo.RtfUpdateNote = Convert.ToBase64String(ExtensionMethods.CompressBuffer(System.IO.File.ReadAllBytes(path))); } } }
void InitDropSupport() { this.AllowDrop = true; this.txtNewSoftDir.AllowDrop = true; //自身 this.DragEnter += (s, e) => { System.Collections.Specialized.StringCollection files; var doe = e.Data as DataObject; if ( !doe.ContainsFileDropList() || (files = doe.GetFileDropList()).Count == 0 || !System.IO.File.Exists(files[0]) || !(files[0].EndsWith(".xml", StringComparison.OrdinalIgnoreCase) || files[0].EndsWith(".auproj", StringComparison.OrdinalIgnoreCase)) ) { return; } e.Effect = DragDropEffects.Link; }; this.DragDrop += (s, e) => { var file = (e.Data as DataObject).GetFileDropList()[0]; if (string.Compare(System.IO.Path.GetExtension(file), ".auproj", true) == 0) { OpenProject(file); } else if (file.EndsWith("update.xml", StringComparison.OrdinalIgnoreCase) || file.EndsWith("update_c.xml", StringComparison.OrdinalIgnoreCase)) { //打开xml var project = AuProject.LoadFromOldProject(file); if (project == null) { Information("无法打开文件 " + file + " !"); } else { UpdatePackageBuilder.Instance.AuProject = project; } } }; //升级包 this.txtNewSoftDir.DragEnter += (s, e) => { System.Collections.Specialized.StringCollection files; var doe = e.Data as DataObject; if ( !doe.ContainsFileDropList() || (files = doe.GetFileDropList()).Count == 0 || !System.IO.Directory.Exists(files[0]) ) { return; } e.Effect = DragDropEffects.Link; }; txtPackagePath.AllowDrop = true; txtPackagePath.DragEnter += (s, e) => { System.Collections.Specialized.StringCollection files; var doe = e.Data as DataObject; if ( !doe.ContainsFileDropList() || (files = doe.GetFileDropList()).Count == 0 || !System.IO.Directory.Exists(files[0]) ) { return; } e.Effect = DragDropEffects.Link; }; this.txtNewSoftDir.DragDrop += (s, e) => { UpdatePackageBuilder.Instance.AuProject.ApplicationDirectory = (e.Data as DataObject).GetFileDropList()[0]; }; this.txtPackagePath.DragDrop += (s, e) => { var project = UpdatePackageBuilder.Instance.AuProject; project.DestinationDirectory = (e.Data as DataObject).GetFileDropList()[0]; }; //RTF rtfPath.AllowDrop = true; rtfPath.DragEnter += (s, e) => { System.Collections.Specialized.StringCollection files; var doe = e.Data as DataObject; if ( !doe.ContainsFileDropList() || (files = doe.GetFileDropList()).Count == 0 || !System.IO.File.Exists(files[0]) || !files[0].EndsWith(".rtf", StringComparison.OrdinalIgnoreCase) ) { return; } e.Effect = DragDropEffects.Link; }; rtfPath.DragDrop += (s, e) => { var file = (e.Data as DataObject).GetFileDropList()[0]; UpdatePackageBuilder.Instance.AuProject.UpdateRtfNotePath = file; }; }
/// <summary> /// 获得XML文件路径 /// </summary> /// <param name="compressed"></param> /// <returns></returns> public string GetXmlFilePath(bool compressed) { return(Path.Combine(AuProject.ParseFullPath(AuProject.DestinationDirectory), "update" + (compressed ? "_c" : "") + ".xml")); }
/// <summary> /// 创建指定包 /// </summary> /// <param name="e"></param> public void BuildPackages(Wrapper.RunworkEventArgs e, UpdateInfo ui) { var targetDir = AuProject.ParseFullPath(AuProject.DestinationDirectory); var appDir = AuProject.ParseFullPath(AuProject.ApplicationDirectory); if (!Directory.Exists(appDir)) { throw new ApplicationException("无效的应用程序目录"); } if (!Directory.Exists(targetDir)) { try { Directory.CreateDirectory(targetDir); } catch (Exception ex) { throw new ApplicationException("无法创建目标目录", ex); } } e.ReportProgress(0, 0, "正在扫描文件列表..."); FileInfo[] allfiles; try { allfiles = new DirectoryInfo(appDir).GetFiles("*.*", SearchOption.AllDirectories); } catch (Exception ex) { throw new ApplicationException("无法扫描来源目录", ex); } //生成映射,排除忽略列表 e.ReportProgress(0, 0, "正在准备文件列表..."); var projectItems = AuProject.Files.ToDictionary(s => s.Path, StringComparer.OrdinalIgnoreCase); var targetfiles = allfiles.Select(s => new KeyValuePair <string, FileInfo>(s.FullName.Remove(0, appDir.Length).Trim(Path.DirectorySeparatorChar), s)) .Where(s => (!projectItems.ContainsKey(s.Key) && AuProject.DefaultUpdateMethod != UpdateMethod.Ignore) || (projectItems.ContainsKey(s.Key) && projectItems[s.Key].UpdateMethod != UpdateMethod.Ignore)) .ToArray(); //古典版的安装包? if (!AuProject.EnableIncreaseUpdate || AuProject.CreateCompatiblePackage) { var mainPkgId = GetPackageName("main") + ".zip"; var file = System.IO.Path.Combine(targetDir, mainPkgId); Result.Add(mainPkgId, "兼容升级模式(或未开启增量更新时)的升级包文件"); e.Progress.TaskCount = targetfiles.Length; CreateZip("正在生成兼容版升级包,正在压缩 {0}", file, ui.PackagePassword, e, targetfiles); var fileInfo = new System.IO.FileInfo(file); ui.PackageSize = fileInfo.Length; e.ReportProgress(0, 0, "正在计算包文件Hash..."); ui.MD5 = Wrapper.ExtensionMethod.GetFileHash(file); ui.Package = mainPkgId; } if (!AuProject.EnableIncreaseUpdate) { return; } //生成主文件包 e.ReportProgress(targetfiles.Length, 0, ""); ui.Packages = new List <PackageInfo>(); var mainFiles = targetfiles .Where(s => (!projectItems.ContainsKey(s.Key) && AuProject.DefaultUpdateMethod == UpdateMethod.Always) || (projectItems.ContainsKey(s.Key) && projectItems[s.Key].UpdateMethod == UpdateMethod.Always)) .ToArray(); if (mainFiles.Length > 0) { var mainPkgId = GetPackageName("alwaysintall") + ".zip"; var pkgName = Path.Combine(targetDir, mainPkgId); e.Progress.TaskCount = mainFiles.Length; CreateZip("正在生成全局升级包,正在压缩 {0}", pkgName, ui.PackagePassword, e, mainFiles); Result.Add(mainPkgId, "全局升级包,包含必须更新的文件"); var fileInfo = new System.IO.FileInfo(pkgName); ui.Packages.Add(new PackageInfo() { Version = "0.0.0.0", VerificationLevel = FileVerificationLevel.None, FilePath = "", FileSize = 0L, FileHash = "", PackageHash = Wrapper.ExtensionMethod.GetFileHash(pkgName), PackageName = mainPkgId, PackageSize = fileInfo.Length, Method = UpdateMethod.Always, Files = mainFiles.Select(s => s.Key).ToArray() }); } //针对单个文件生成包 e.Progress.TaskCount = targetfiles.Length; e.Progress.TaskProgress = 0; foreach (var file in targetfiles) { ProjectItem config; if (!projectItems.ContainsKey(file.Key)) { if (AuProject.DefaultUpdateMethod == UpdateMethod.Always || AuProject.DefaultUpdateMethod == UpdateMethod.Ignore) { continue; } config = new ProjectItem() { UpdateMethod = AuProject.DefaultUpdateMethod, FileVerificationLevel = AuProject.DefaultFileVerificationLevel }; } else { config = projectItems[file.Key]; //fix always pack issue if (config.UpdateMethod != UpdateMethod.VersionCompare && config.UpdateMethod != UpdateMethod.SkipIfExists) { continue; } } //file info var fdi = System.Diagnostics.FileVersionInfo.GetVersionInfo(file.Value.FullName); //var pkgFileName = file.Key.Replace("\\", "_").Replace(".", "_") + ".zip"; var pkgFileName = GetPackageName(file.Key) + ".zip"; var pkg = Path.Combine(targetDir, pkgFileName); e.ReportProgress(e.Progress.TaskCount, ++e.Progress.TaskProgress, "正在生成增量包 " + file.Key + ", 正在压缩...."); CreateZip(null, pkg, ui.PackagePassword, null, new[] { file }); Result.Add(pkgFileName, "文件【" + file.Key + "】的增量升级包"); var pkgInfo = new System.IO.FileInfo(pkg); ui.Packages.Add(new PackageInfo() { Version = string.IsNullOrEmpty(fdi.FileVersion) ? "0.0.0.0" : Wrapper.ExtensionMethod.ConvertVersionInfo(fdi).ToString(), VerificationLevel = config.FileVerificationLevel, FilePath = file.Key, FileSize = new FileInfo(file.Value.FullName).Length, FileHash = Wrapper.ExtensionMethod.GetFileHash(file.Value.FullName), PackageHash = Wrapper.ExtensionMethod.GetFileHash(pkg), PackageName = pkgFileName, PackageSize = pkgInfo.Length, Method = config.UpdateMethod, Files = new[] { file.Key } }); } }
protected override void BuilderFailed(AuProject project, Exception exception, UpdateInfo resultUpdateInfo) { _form.SetFailed(); System.Windows.Forms.MessageBox.Show("更新项目构建失败:" + exception.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); base.BuilderFailed(project, exception, resultUpdateInfo); }
protected override void BuildSuccess(AuProject project, Dictionary<string, string> packages, UpdateInfo resultUpdateInfo) { _form.SetSuccess(); System.Windows.Forms.MessageBox.Show("更新项目构建成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); base.BuildSuccess(project, packages, resultUpdateInfo); }
/// <summary> /// 构建成功 /// </summary> /// <param name="project"></param> /// <param name="packages"></param> /// <param name="resultUpdateInfo"></param> protected virtual void BuildSuccess(AuProject project, Dictionary <string, string> packages, UpdateInfo resultUpdateInfo) { OnWorkerShutdown(); }
/// <summary> /// 重新绑定数据 /// </summary> /// <param name="project"></param> void RebindDefaultUpdateMethodInfo(AuProject project) { rbAlways.Checked = Utility.HasMethod(project.DefaultUpdateMethod, UpdateMethod.Always); rbVersionCheck.Checked = Utility.HasMethod(project.DefaultUpdateMethod, UpdateMethod.VersionCompare); rbOnlyNotExist.Checked = Utility.HasMethod(project.DefaultUpdateMethod, UpdateMethod.SkipIfExists); rbIgnore.Checked = Utility.HasMethod(project.DefaultUpdateMethod, UpdateMethod.Ignore); chkSkipIfNotExist.Checked = Utility.HasMethod(project.DefaultUpdateMethod, UpdateMethod.SkipIfNotExist); lblCheckTypeDesc.Text = Utility.HasMethod(project.DefaultUpdateMethod ,UpdateMethod.VersionCompare) ? project.DefaultFileVerificationLevel.ToDisplayString() : "点击选项时选择比较类型"; }
protected override void BuildSuccess(AuProject project, Dictionary <string, string> packages, UpdateInfo resultUpdateInfo) { _form.SetSuccess(); System.Windows.Forms.MessageBox.Show("更新项目构建成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); base.BuildSuccess(project, packages, resultUpdateInfo); }
/// <summary> /// 构建失败 /// </summary> /// <param name="project"></param> /// <param name="exception"></param> /// <param name="resultUpdateInfo"></param> protected virtual void BuilderFailed(AuProject project, Exception exception, UpdateInfo resultUpdateInfo) { OnWorkerShutdown(); }
/// <summary> /// 创建 <see cref="PackageEventArgs" /> 的新实例(PackageEventArgs) /// </summary> /// <param name="auProject"></param> public PackageEventArgs(AuProject auProject) { AuProject = auProject; }
void BindProject(AuProject project) { var ui = project.UpdateInfo; chkUseIncreaseUpdate.AddDataBinding(project, s => s.Checked, s => s.EnableIncreaseUpdate); chkCompressUpdateInfo.AddDataBinding(project, s => s.Checked, s => s.CompressPackage); chkCreateCompatiblePackage.AddDataBinding(project, s => s.Checked, s => s.CreateCompatiblePackage); this.deletePreviousFileMode.SelectedIndex = (int)ui.DeleteMethod; this.deleteRules.Text = ui.DeleteFileLimits.IsEmpty() ? "" : string.Join(Environment.NewLine, ui.DeleteFileLimits); txtPackagePassword.AddDataBinding(ui, s => s.Text, s => s.PackagePassword); requiredMinVersion.AddDataBinding(ui, s => s.Text, s => s.RequiredMinVersion); project.PropertyChanged += (s, e) => { if (e.PropertyName == "DefaultUpdateMethod" || e.PropertyName == "DefaultFileVerificationLevel") RebindDefaultUpdateMethodInfo(s as AuProject); }; RebindDefaultUpdateMethodInfo(project); }