/// <summary> /// 删除原始安装文件 /// </summary> bool DeletePreviousFile(RunworkEventArgs e) { if (this.UpdateInfo.DeleteMethod == DeletePreviousProgramMethod.None) { return(true); } e.PostEvent(OnDeleteFileStart); var bakPath = RollbackPath; var rules = UpdateInfo.GetDeleteFileLimitRuleSet(); //找到所有文件 var allOldFiles = System.IO.Directory.GetFiles(ApplicationRoot, "*.*", System.IO.SearchOption.AllDirectories); //备份 var index = 0; foreach (var file in allOldFiles) { var rPath = file.Remove(0, ApplicationRoot.Length).TrimEnd('\\'); //保留的文件 if (PreservedFiles.ContainsKey(rPath)) { Trace.TraceInformation("文件 {0} 在保持文件列表中,跳过删除", file); continue; } var dPath = System.IO.Path.Combine(bakPath, rPath); if ((UpdateInfo.DeleteMethod == DeletePreviousProgramMethod.AllExceptSpecified && rules.FindIndex(s => s.IsMatch(rPath)) == -1) || (UpdateInfo.DeleteMethod == DeletePreviousProgramMethod.NoneButSpecified && rules.FindIndex(s => s.IsMatch(rPath)) != -1) ) { e.PostEvent(() => OnDeleteFile(new InstallFileEventArgs(file, dPath, allOldFiles.Length, ++index))); try { System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(dPath)); Trace.TraceInformation("备份并删除文件: {0} -> {1}", file, dPath); System.IO.File.Copy(file, dPath); System.IO.File.Delete(file); bakList.Add(rPath); } catch (Exception ex) { this.Exception = ex; Trace.TraceWarning("删除失败:" + ex.Message); return(false); } } } e.PostEvent(OnDeleteFileFinished); return(true); }
/// <summary> /// 删除原始安装文件 /// </summary> bool DeletePreviousFile(RunworkEventArgs e) { if (UpdateInfo.DeleteMethod == DeletePreviousProgramMethod.None) { return(true); } e.PostEvent(OnDeleteFileStart); var bakPath = RollbackPath; var rules = UpdateInfo.GetDeleteFileLimitRuleSet(); //找到所有文件 var allOldFiles = Directory.GetFiles(ApplicationRoot, "*.*", SearchOption.AllDirectories); //备份 var index = 0; foreach (var file in allOldFiles) { e.ReportProgress(allOldFiles.Length, ++index, file); var rPath = file.Remove(0, ApplicationRoot.Length).TrimEnd('\\'); //保留的文件 if (PreservedFiles.ContainsKey(rPath)) { _logger.LogInformation($"File '{file}' not touched as it was in reserve list."); continue; } var dPath = Path.Combine(bakPath, rPath); if ((UpdateInfo.DeleteMethod == DeletePreviousProgramMethod.AllExceptSpecified && rules.FindIndex(s => s.IsMatch(rPath)) == -1) || (UpdateInfo.DeleteMethod == DeletePreviousProgramMethod.NoneButSpecified && rules.FindIndex(s => s.IsMatch(rPath)) != -1) ) { e.PostEvent(() => OnDeleteFile(new InstallFileEventArgs(file, dPath, allOldFiles.Length, index, rPath))); Directory.CreateDirectory(Path.GetDirectoryName(dPath)); _logger.LogInformation($"Backup and remove file: '{file}' -> '{dPath}'"); File.Copy(file, dPath); var tryCount = 0; while (true) { ++tryCount; try { File.Delete(file); break; } catch (Exception ex) { Exception = ex; _logger.LogError($"No.{tryCount} attempt to remove file failed: {ex.Message}", ex); } //如果删除失败,则等待1秒后重试 if (tryCount < 10) { Thread.Sleep(1000); } else { return(false); } } _bakList.Add(rPath); } } e.PostEvent(OnDeleteFileFinished); return(true); }