/// <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);
        }