private void CoverSiteThread(WebSiteServer ServObj)
        {
            string name  = this.SiteObj.SiteBaseInfo.NAME;
            int    count = this.SiteObj.SiteBaseInfo.SERVLIST.Count;

            foreach (TaskFileInfo filePair in this.SiteObj.FilePairList)
            {
                if (!this.hasError)
                {
                    if (this.CoverServ(ServObj, filePair, name, new FtpAtomOperation(this.dbLog)))
                    {
                        this.dbLog.Trace("[覆盖]单个服务器", name, "[成功]___服务器名:" + ServObj.NAME + "文件路径:" + filePair.AimFile);
                        UploadTrace.AddLog(filePair, this.block, "覆盖文件:" + filePair.FileName + "到:" + ServObj.NAME + "成功.");
                        ++this.successnum;
                        UploadTrace.FileCoverSuccess(filePair, this.block, "");
                    }
                    else
                    {
                        UploadTrace.FileCoverFail(filePair, this.block, ServObj.NAME, "");
                        this._coverErrorFile   = filePair;
                        this._coverErrorServer = ServObj;
                        UploadTrace.AddLog(filePair, this.block, "覆盖文件:" + filePair.FileName + "到:" + ServObj.NAME + "出错.准备回滚");
                        this.dbLog.Trace("[覆盖]单个服务器", name, "[失败]___服务器名:" + ServObj.NAME + "文件路径:" + filePair.AimFile);
                        this.hasError = true;
                        break;
                    }
                }
            }
        }
 /// <summary>
 /// 任务控制:覆盖
 /// </summary>
 /// <returns></returns>
 private bool CoverSite()
 {
     if (!this.multiCover)
     {
         string name  = this.SiteObj.SiteBaseInfo.NAME;
         int    count = this.SiteObj.SiteBaseInfo.SERVLIST.Count;
         int    num   = 0;
         foreach (WebSiteServer ServObj in this.SiteObj.SiteBaseInfo.SERVLIST)
         {
             string coverStatus = num.ToString() + (object)"/" + (string)(object)count;
             foreach (TaskFileInfo filePair in this.SiteObj.FilePairList)
             {
                 if (this.CoverServ(ServObj, filePair, name, new FtpAtomOperation(this.dbLog)))
                 {
                     this.dbLog.Trace("[覆盖]单个服务器", name, "[成功]___服务器名:" + ServObj.NAME + "文件路径:" + filePair.AimFile);
                     UploadTrace.FileCoverSuccess(filePair, this.block, coverStatus);
                 }
                 else
                 {
                     UploadTrace.FileCoverFail(filePair, this.block, ServObj.NAME, coverStatus);
                     this._coverErrorFile   = filePair;
                     this._coverErrorServer = ServObj;
                     UploadTrace.AddLog(filePair, this.block, "覆盖文件:" + filePair.FileName + "到:" + ServObj.NAME + "出错.准备回滚");
                     this.dbLog.Trace("[覆盖]单个服务器", name, "[失败]___服务器名:" + ServObj.NAME + "文件路径:" + filePair.AimFile);
                     return(false);
                 }
             }
             ++num;
         }
         return(true);
     }
     else
     {
         this.successnum = 0;
         if (UploadTrace.IsTaskCancel(this.block))
         {
             return(false);
         }
         try
         {
             foreach (WebSiteServer serv in this.SiteObj.SiteBaseInfo.SERVLIST)
             {
                 TaskWorker.doCover doCover = new TaskWorker.doCover(this.CoverSiteThread);
                 doCover.BeginInvoke(serv, new AsyncCallback(this.doCoverCallBack), (object)doCover);
             }
         }
         catch
         {
             return(false);
         }
         while (!this.hasError && this.successnum != this.SiteObj.FilePairList.Count * this.SiteObj.SiteBaseInfo.SERVLIST.Count)
         {
             Thread.Sleep(100);
         }
         return(!this.hasError);
     }
 }
        private void BackSiteThread(int threadid)
        {
            string name = this.SiteObj.SiteBaseInfo.NAME;

            foreach (TaskFileInfo filePair in this.file[threadid])
            {
                if (filePair != null && !this.hasError)
                {
                    if (UploadTrace.IsTaskCancel(this.block))
                    {
                        this.hasError = true;
                        break;
                    }
                    else
                    {
                        try
                        {
                            string fileName      = filePair.FileName;
                            byte[] backFileBytes = this.GetBackFileBytes(this.SiteObj.SiteBaseInfo.SERVLIST[0], filePair, this.SiteObj.SiteBaseInfo.LOCALBAKTRANSFOLDER, this.SiteObj.SiteBaseInfo.NAME);
                            if (backFileBytes != null)
                            {
                                foreach (WebSiteServer ServObj in this.SiteObj.SiteBaseInfo.SERVLIST)
                                {
                                    if (UploadTrace.IsTaskCancel(this.block))
                                    {
                                        this.hasError = true;
                                        return;
                                    }
                                    else if (this.BackupServ(ServObj, backFileBytes, name, filePair, this._BackupBlock, new FtpAtomOperation(this.dbLog)))
                                    {
                                        this.LogRollBack(ServObj, filePair, name, this._BackupBlock, "COVER");
                                        this.dbLog.Trace("[备份]单个服务器", name, "[成功]___服务器名:" + ServObj.NAME + ",文件名:" + fileName);
                                    }
                                    else
                                    {
                                        UploadTrace.FileBackupFail(filePair, this.block, ServObj.NAME);
                                        UploadTrace.AddLog(filePair, this.block, "文件备份:" + filePair.FileName + "到:" + ServObj.NAME + "出错.");
                                        this.dbLog.Trace("[备份]单个服务器", name, "[失败]___服务器名:" + ServObj.NAME + ",文件名:" + fileName);
                                        this.hasError = true;
                                    }
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            UploadTrace.AddLog(filePair, this.block, "文件备份:" + filePair.FileName + "出错.出错原因:" + ex.Message + ex.StackTrace);
                            UploadTrace.FileUploadFail(filePair, this.block, "");
                            this.hasError = true;
                            break;
                        }
                        UploadTrace.FileBackupSuccess(filePair, this.block);
                        ++this.successnum;
                    }
                }
            }
        }
 /// <summary>
 /// 任务控制:线程上传
 /// </summary>
 /// <param name="threadid"></param>
 private void UploadSiteThread(int threadid)
 {
     foreach (TaskFileInfo filePair in this.file[threadid])
     {
         if (filePair != null && !this.hasError)
         {
             if (UploadTrace.IsTaskCancel(this.block))
             {
                 this.hasError = true;
                 break;
             }
             else
             {
                 try
                 {
                     FileStream fileStream = File.Open(filePair.SrcFile, FileMode.Open, FileAccess.Read, FileShare.Read);
                     byte[]     numArray   = new byte[fileStream.Length];
                     fileStream.Read(numArray, 0, numArray.Length);
                     fileStream.Close();
                     fileStream.Dispose();
                     string name = this.SiteObj.SiteBaseInfo.NAME;
                     foreach (WebSiteServer ServObj in this.SiteObj.SiteBaseInfo.SERVLIST)
                     {
                         if (UploadTrace.IsTaskCancel(this.block))
                         {
                             this.hasError = true;
                             return;
                         }
                         else if (!this.UploadServ(ServObj, numArray, name, filePair, new FtpAtomOperation(this.dbLog)))
                         {
                             this.hasError = true;
                             return;
                         }
                     }
                 }
                 catch (Exception ex)
                 {
                     UploadTrace.AddLog(filePair, this.block, "文件上传:" + filePair.FileName + "出错.出错原因:" + ex.Message);
                     UploadTrace.FileUploadFail(filePair, this.block, "");
                     this.hasError = true;
                     break;
                 }
                 UploadTrace.FileUploadSuccess(filePair, this.block);
                 ++this.successnum;
             }
         }
     }
 }
        private bool RollbackServ(WebSiteServer ServObj, TaskFileInfo FileObj, string SiteName, string block, string serverstatus)
        {
            string SrcUriStr = "";

            //如果_BackupBlock不为空,则为同步任务失败的回滚,否则为延后回滚
            if (!string.IsNullOrEmpty(this._BackupBlock))
            {
                SrcUriStr = this.PreBakAimFile(ServObj, FileObj, this._BackupBlock).Replace("//", "/");
            }
            else
            {
                SrcUriStr = this.PreBakAimFile(ServObj, FileObj, this.block).Replace("//", "/");
            }
            string AimUriStr = this.PreCoverAimFile(ServObj, FileObj);

            try
            {
                this.dbLog.Trace("[级联检查/回滚]覆盖目标目录", SiteName, "[成功]___服务器名:" + ServObj.NAME + ",路径:" + FileObj.RelAimFolder);
                if (this.ftpcmd.RenameFtpFile(ServObj.BaseUri, SrcUriStr, AimUriStr, ServObj.USER, ServObj.PASS))
                {
                    UploadTrace.FileRollBackSuccess(FileObj, block, serverstatus);
                    this.AutoRollBackSuccess(ServObj, FileObj, SiteName, this._BackupBlock, "COVER", block);
                    this.dbLog.Trace("[文件回滚]单个服务器", SiteName, "[成功]___服务器名:" + ServObj.NAME + ",文件源位置:" + SrcUriStr + ",文件目标位置:" + AimUriStr);
                    return(true);
                }
                else
                {
                    UploadTrace.FileRollBackFail(FileObj, block, ServObj.NAME, serverstatus);
                    UploadTrace.AddLog(FileObj, block, "文件回滚:" + FileObj.FileName + "到:" + ServObj.NAME + "出错.");
                    this.dbLog.Trace("[文件回滚]单个服务器", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",文件源位置:" + SrcUriStr + ",文件目标位置:" + AimUriStr);
                    this._coverErrorServer = ServObj;
                    this._coverErrorFile   = FileObj;
                    return(false);
                }
            }
            catch
            {
                UploadTrace.FileRollBackFail(FileObj, block, ServObj.NAME, serverstatus);
                UploadTrace.AddLog(FileObj, block, "文件回滚:" + FileObj.FileName + "到:" + ServObj.NAME + "出错.");
                this.dbLog.Trace("[文件回滚]单个服务器", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",文件源位置:" + SrcUriStr + ",文件目标位置:" + AimUriStr);
                return(false);
            }
        }
 public bool RollBackSite()
 {
     try
     {
         //Trans.DataLayer.Model.Block BlockInfo = UploadTrace.GetBlockInfo(this.block);
         Trans.Db.Model.NBlock_Info BlockInfo = Trans.Db.Data.NBlock_Info.Get("BlockCode=@BlockCode", "", new object[] { this.block }, true);
         //string VMark = BlockInfo.VMark;
         string VMark = BlockInfo.ActionMark;
         this._BackupBlock = VMark;
         string              name             = this.SiteObj.SiteBaseInfo.NAME;
         DataTable           rollBackTaskList = UploadTrace.getRollBackTaskList(this.block);
         List <TaskFileInfo> list             = new List <TaskFileInfo>();
         foreach (DataRow dataRow in (InternalDataCollectionBase)rollBackTaskList.Rows)
         {
             string SrcPath = dataRow["FilePath"].ToString().Replace("..", "");
             string AimPath = dataRow["FilePath"].ToString();
             list.Add(new TaskFileInfo(SrcPath, AimPath));
         }
         int count = this.SiteObj.SiteBaseInfo.SERVLIST.Count;
         int num   = 1;
         foreach (WebSiteServer ServObj in this.SiteObj.SiteBaseInfo.SERVLIST)
         {
             string serverstatus = num.ToString() + "/" + count.ToString();
             foreach (TaskFileInfo FileObj in list)
             {
                 if (this._coverErrorServer == null)// || !(FileObj.FileName == this._coverErrorFile.FileName) || !(ServObj.NAME == this._coverErrorServer.NAME))
                 {
                     this.RollbackServ(ServObj, FileObj, name, this.block, serverstatus);
                 }
                 else
                 {
                     return(false);
                 }
             }
             ++num;
         }
         return(true);
     }
     catch
     {
         return(false);
     }
 }
 /// <summary>
 /// 任务控制:上传
 /// </summary>
 /// <returns></returns>
 private bool UploadSite()
 {
     if (UploadTrace.IsTaskCancel(this.block))
     {
         return(false);
     }
     try
     {
         for (int threadid = 0; threadid < this.file.Length; ++threadid)
         {
             TaskWorker.doUpload doUpload = new TaskWorker.doUpload(this.UploadSiteThread);
             doUpload.BeginInvoke(threadid, new AsyncCallback(this.AddMsgCallBack), (object)doUpload);
         }
     }
     catch
     {
         return(false);
     }
     while (!this.hasError && this.successnum != this.SiteObj.FilePairList.Count)
     {
         Thread.Sleep(100);
     }
     return(!this.hasError);
 }
        /// <summary>
        /// 同步
        /// </summary>
        public void Execute()
        {
            try
            {
                //记录开始日志
                this.dbLog.Trace("站点同步", this.SiteObj.SiteBaseInfo.NAME, "开始同步");

                #region  务器检查
                Msg msg = this.CheckServs(this.SiteObj);
                if (!msg.MsgResult)
                {
                    this.dbLog.Trace("检查服务器状态", this.SiteObj.SiteBaseInfo.NAME, "服务器网络连接出现问题:" + msg.MsgContent + "有服务器出现网络连接错误,请立即通知技术人员维护");
                    UploadTrace.TaskFailed(this.block);
                    return;
                }
                else
                {
                    this.dbLog.Trace("检查服务器状态", this.SiteObj.SiteBaseInfo.NAME, "一切正常");
                }
                #endregion

                #region 判定是否用户取消任务
                if (UploadTrace.IsTaskCancel(this.block))
                {
                    this.dbLog.Trace("上传站点", this.SiteObj.SiteBaseInfo.NAME, "失败,用户取消");
                    return;
                }
                #endregion

                #region  照线程分割文件列表到线程任务中
                this.file = new TaskFileInfo[this.threadNumber][];
                for (int index = 0; index < this.threadNumber; ++index)
                {
                    this.file[index] = new TaskFileInfo[this.SiteObj.FilePairList.Count / this.threadNumber + 1];
                }

                for (int index = 0; index < this.SiteObj.FilePairList.Count; ++index)
                {
                    TaskFileInfo filePair = this.SiteObj.FilePairList[index];
                    this.file[index / (this.SiteObj.FilePairList.Count / this.threadNumber + 1)][index % (this.SiteObj.FilePairList.Count / this.threadNumber + 1)] = filePair;
                }
                #endregion

                #region 步骤一:上传文件到所有任务服务器
                if (!this.UploadSite())
                {
                    this.dbLog.Trace("上传站点", this.SiteObj.SiteBaseInfo.NAME, "失败,任务终止");
                    UploadTrace.TaskFailed(this.block);
                    return;
                }
                else
                {
                    this.dbLog.Trace("上传站点", this.SiteObj.SiteBaseInfo.NAME, "成功");
                }
                #endregion

                #region 判定是否用户取消任务
                if (UploadTrace.IsTaskCancel(this.block))
                {
                    this.dbLog.Trace("上传站点", this.SiteObj.SiteBaseInfo.NAME, "失败,用户取消");
                    return;
                }
                #endregion

                #region 步骤二:备份文件到所有任务服务器
                if (!this.BackupSite())
                {
                    this.dbLog.Trace("备份站点", this.SiteObj.SiteBaseInfo.NAME, "失败,任务终止");
                    UploadTrace.TaskFailed(this.block);
                    return;
                }
                else
                {
                    this.dbLog.Trace("备份站点", this.SiteObj.SiteBaseInfo.NAME, "成功");
                }
                UploadTrace.TaskBackuping(this.block);
                #endregion

                #region 判定用户是否取消任务
                if (UploadTrace.IsTaskCancel(this.block))
                {
                    this.dbLog.Trace("上传站点", this.SiteObj.SiteBaseInfo.NAME, "失败,用户取消");
                    return;
                }
                #endregion

                #region 步骤三:覆盖文件到所有任务服务器
                if (this.CoverSite())
                {
                    this.dbLog.Trace("覆盖站点", this.SiteObj.SiteBaseInfo.NAME, "成功");
                    this.dbLog.Trace("同步站点", this.SiteObj.SiteBaseInfo.NAME, "结束同步");
                    UploadTrace.TaskSuccess(this.block);
                    return;
                }
                else
                {
                    this.dbLog.Trace("覆盖站点", this.SiteObj.SiteBaseInfo.NAME, "失败,任务终止");
                }
                UploadTrace.TaskCovering(this.block);
                #endregion

                #region 步骤四:回滚文件到所有任务服务器
                if (this.RollBackSite())
                {
                    this.dbLog.Trace("覆盖回滚", this.SiteObj.SiteBaseInfo.NAME, "成功");
                }
                else
                {
                    this.dbLog.Trace("覆盖回滚", this.SiteObj.SiteBaseInfo.NAME, "失败,任务终止");
                }
                UploadTrace.TaskFailed(this.block);
                #endregion
            }
            catch (Exception ex)
            {
                this.dbLog.Trace("上传站点", this.SiteObj.SiteBaseInfo.NAME, "失败,任务终止。错误信息:" + ex.Message + ex.StackTrace);
                UploadTrace.TaskFailed(this.block);
            }
        }