private bool CoverServ(WebSiteServer ServObj, TaskFileInfo FileObj, string SiteName, FtpAtomOperation ftpCmdV3)
        {
            string SrcUriStr = this.PreCoverSrcFile(ServObj, FileObj);
            string AimUriStr = this.PreCoverAimFile(ServObj, FileObj);

            if (ftpCmdV3.CreateFtpListDirectory(ServObj.BaseUri, "/" + ServObj.DIRPATH + FileObj.RelAimFolder, ServObj.USER, ServObj.PASS))
            {
                this.dbLog.Trace("[级联检查/创建]覆盖目标目录", SiteName, "[成功]___服务器名:" + ServObj.NAME + ",路径:" + FileObj.RelAimFolder);
                if (ftpCmdV3.RenameFtpFile(ServObj.BaseUri, SrcUriStr, AimUriStr, ServObj.USER, ServObj.PASS))
                {
                    this.dbLog.Trace("[文件移动]单个服务器", SiteName, "[成功]___服务器名:" + ServObj.NAME + ",文件源位置:" + SrcUriStr + ",文件目标位置:" + AimUriStr);
                    return(true);
                }
                else
                {
                    this.dbLog.Trace("[文件移动]单个服务器", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",文件源位置:" + SrcUriStr + ",文件目标位置:" + AimUriStr);
                    return(false);
                }
            }
            else
            {
                this.dbLog.Trace("[级联检查/创建]覆盖目标目录", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",路径:" + FileObj.RelAimFolder);
                return(false);
            }
        }
        private bool BackupServ(WebSiteServer ServObj, byte[] FileBytes, string SiteName, TaskFileInfo FileObj, string BackupBlock, FtpAtomOperation ftpCmdV3)
        {
            string AimUriStr1 = this.PreBakAimFolder(ServObj, FileObj, BackupBlock);

            if (ftpCmdV3.CreateFtpListDirectory(ServObj.BaseUri, AimUriStr1, ServObj.USER, ServObj.PASS))
            {
                this.dbLog.Trace("[创建备份目录]", SiteName, "[成功]___服务器名:" + ServObj.NAME + ",路径:" + AimUriStr1);
                string AimUriStr2 = this.PreBakAimFile(ServObj, FileObj, BackupBlock);
                if (ftpCmdV3.UploadFtpFile(ServObj.BaseUri, AimUriStr2, ServObj.USER, ServObj.PASS, FileBytes))
                {
                    this.dbLog.Trace("[上传备份文件]单个服务器", SiteName, "[成功]___服务器名:" + ServObj.NAME + ",备份路径:" + AimUriStr2);
                    return(true);
                }
                else
                {
                    this.dbLog.Trace("[上传备份文件]单个服务器", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",备份路径:" + AimUriStr2);
                    return(false);
                }
            }
            else
            {
                this.dbLog.Trace("[创建备份目录]", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",路径:" + AimUriStr1);
                return(false);
            }
        }
        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;
                    }
                }
            }
        }
        private void AutoRollBackSuccess(WebSiteServer ServObj, TaskFileInfo FileObj, string SiteName, string MarkBlock, string RollOp, string block)
        {
            string str1 = FileObj.RelAimFolder + "/" + FileObj.FileName;
            string str2 = "/" + ServObj.BAKFOLDER + "/" + MarkBlock + str1;

            this.dbLog.RollBakAutoSuccess(MarkBlock, ServObj.IP.ToString(), ServObj.PORT, str2, str1, SiteName, RollOp, this.block);
        }
        /// <summary>
        /// 上传文件到单个服务器
        /// </summary>
        /// <param name="ServObj"></param>
        /// <param name="FileBytes"></param>
        /// <param name="SiteName"></param>
        /// <param name="FileObj"></param>
        /// <param name="ftpcmdv3"></param>
        /// <returns></returns>
        private bool UploadServ(WebSiteServer ServObj, byte[] FileBytes, string SiteName, TaskFileInfo FileObj, FtpAtomOperation ftpcmdv3)
        {
            string AimUriStr1 = this.PreUpAimFolder(ServObj, FileObj);
            string AimUriStr2 = this.PreUpAimFile(ServObj, FileObj);

            if (!ftpcmdv3.CreateFtpListDirectory(ServObj.BaseUri, AimUriStr1, ServObj.USER, ServObj.PASS))
            {
                this.dbLog.Trace("[级联创建]单个服务器", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",路径:" + AimUriStr1);
                return(false);
            }
            else
            {
                try
                {
                    this.dbLog.Trace("[级联创建]单个服务器", SiteName, "[成功]___服务器名:" + ServObj.NAME + ",路径:" + AimUriStr1);
                    if (!ftpcmdv3.UploadFtpFile(ServObj.BaseUri, AimUriStr2, ServObj.USER, ServObj.PASS, FileBytes))
                    {
                        this.dbLog.Trace("[上传文件]单个服务器", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",路径:" + AimUriStr2);
                        return(false);
                    }
                    else
                    {
                        this.dbLog.Trace("[上传文件]单个服务器", SiteName, "[成功]___服务器名:" + ServObj.NAME + ",路径:" + AimUriStr2);
                        return(true);
                    }
                }
                catch (Exception ex)
                {
                    this.dbLog.Trace("[上传文件]单个服务器", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",路径:" + AimUriStr2 + ",错误信息:" + ex.Message);
                    return(false);
                }
            }
        }
 /// <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);
     }
 }
 /// <summary>
 /// 生成覆盖操作目标文件路径
 /// </summary>
 /// <param name="ServObj"></param>
 /// <param name="FileObj"></param>
 /// <returns></returns>
 private string PreCoverAimFile(WebSiteServer ServObj, TaskFileInfo FileObj)
 {
     if (!string.IsNullOrEmpty(ServObj.DIRPATH))
     {
         return("/" + ServObj.DIRPATH + (string.IsNullOrEmpty(FileObj.RelAimFolder) ? "" : FileObj.RelAimFolder) + "/" + FileObj.FileName);
     }
     else
     {
         return((string.IsNullOrEmpty(FileObj.RelAimFolder) ? "" : FileObj.RelAimFolder) + "/" + FileObj.FileName);
     }
 }
 /// <summary>
 /// 生成备份文件路径
 /// </summary>
 /// <param name="ServObj"></param>
 /// <param name="FileObj"></param>
 /// <param name="BackBlock"></param>
 /// <returns></returns>
 private string PreBakAimFile(WebSiteServer ServObj, TaskFileInfo FileObj, string BackBlock)
 {
     if (!string.IsNullOrEmpty(ServObj.DIRPATH))
     {
         return(ServObj.DIRPATH + "/" + ServObj.BAKFOLDER + "/" + BackBlock + FileObj.AimFile.Replace("../", "/"));
     }
     else
     {
         return(ServObj.BAKFOLDER + "/" + BackBlock + FileObj.AimFile.Replace("../", "/"));
     }
 }
 /// <summary>
 /// 生成备份文件目录
 /// </summary>
 /// <param name="ServObj"></param>
 /// <param name="FileObj"></param>
 /// <param name="BackBlock"></param>
 /// <returns></returns>
 private string PreBakAimFolder(WebSiteServer ServObj, TaskFileInfo FileObj, string BackBlock)
 {
     if (!string.IsNullOrEmpty(ServObj.DIRPATH))
     {
         return(ServObj.DIRPATH + "/" + ServObj.BAKFOLDER + "/" + BackBlock + FileObj.RelAimFolder);
     }
     else
     {
         return(ServObj.BAKFOLDER + "/" + BackBlock + FileObj.RelAimFolder);
     }
 }
 /// <summary>
 /// 生成上传文件路径
 /// </summary>
 /// <param name="ServObj"></param>
 /// <param name="FileObj"></param>
 /// <returns></returns>
 private string PreUpAimFile(WebSiteServer ServObj, TaskFileInfo FileObj)
 {
     if (!string.IsNullOrEmpty(ServObj.DIRPATH))
     {
         return(ServObj.DIRPATH + "/" + ServObj.TRANSFOLDER + "/" + this.block + FileObj.AimFile.Replace("../", "/"));
     }
     else
     {
         return(ServObj.TRANSFOLDER + "/" + this.block + FileObj.AimFile.Replace("../", "/"));
     }
 }
 /// <summary>
 /// 生成上传目录
 /// </summary>
 /// <param name="ServObj"></param>
 /// <param name="FileObj"></param>
 /// <returns></returns>
 private string PreUpAimFolder(WebSiteServer ServObj, TaskFileInfo FileObj)
 {
     if (!string.IsNullOrEmpty(ServObj.DIRPATH))
     {
         return(ServObj.DIRPATH + "/" + ServObj.TRANSFOLDER + "/" + this.block + FileObj.RelAimFolder);
     }
     else
     {
         return(ServObj.TRANSFOLDER + "/" + this.block + FileObj.RelAimFolder);
     }
 }
        private byte[] GetBackFileBytes(WebSiteServer ServObj, TaskFileInfo FileObj, string LocalTransFolder, string SiteName)
        {
            bool   flag            = false;
            string ServRelFilePath = "/" + ServObj.DIRPATH + FileObj.AimFile.Replace("../", "/");

            if (this.ftpcmd.GetFtpFileSize(ServObj.BaseUri, ServRelFilePath, ServObj.USER, ServObj.PASS) != -1)
            {
                flag = true;
            }
            if (!flag)
            {
                return((byte[])null);
            }
            if (!Directory.Exists(LocalTransFolder))
            {
                this.CreateLocalListDir(LocalTransFolder);
            }
            if (!Directory.Exists(LocalTransFolder + "/" + this.block))
            {
                this.CreateLocalListDir(LocalTransFolder + "/" + this.block);
            }
            if (!Directory.Exists(LocalTransFolder + "/" + this.block + FileObj.RelAimFolder))
            {
                this.CreateLocalListDir(LocalTransFolder + "/" + this.block + FileObj.RelAimFolder);
            }
            //备份转存本地临时文件路径
            string str = LocalTransFolder + "/" + this.block + FileObj.RelAimFolder + "/" + FileObj.FileName;

            if (this.ftpcmd.DownLoadFtpFile(ServObj.BaseUri, ServRelFilePath, str, ServObj.USER, ServObj.PASS))
            {
                FileStream fileStream = File.Open(str, FileMode.Open, FileAccess.Read, FileShare.Read);
                byte[]     buffer     = new byte[fileStream.Length];
                fileStream.Read(buffer, 0, buffer.Length);
                fileStream.Close();
                fileStream.Dispose();
                this.dbLog.Trace("[备份下载]下载文件", SiteName, "[成功]___服务器名:" + ServObj.NAME + ",文件名:" + ServRelFilePath);
                return(buffer);
            }
            else
            {
                this.dbLog.Trace("[备份下载]下载文件", SiteName, "[失败]___服务器名:" + ServObj.NAME + ",文件名:" + ServRelFilePath);
                return((byte[])null);
            }
        }
        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);
            }
        }