private void _localSync(Config config) { #region 步到本地目的目录 try { //获取所有MonitorServer,以便于数据处理 MonitorServerDAL msd = new MonitorServerDAL(); List <MonitorServer> msList = msd.GetAllMonitorServer(config); #region 获取SSH输出路径中的第一层子目录 (PS:此情况为:SSH输出路径 必须配置) //获取SSH输出基础路径 暂时不支持网络位置 DirectoryInfo sshDI = new DirectoryInfo(config.Path.OutputPath); if (sshDI.Exists) { //获取MonitorServer相对的SSH根目录 foreach (DirectoryInfo di in sshDI.EnumerateDirectories()) { if (Signal.IsSystemStoping) { break; } //获取对应的MonitorServer int flagIndex = di.Name.LastIndexOf("-SSH"); if (flagIndex <= 0) { continue; } Common.Util.LogManager.WriteLog(Common.Util.LogFile.LocalSync, di.FullName); string msName = di.Name.Substring(0, flagIndex); MonitorServer ms = msList.Find(x => x.monitorServerName.Equals(msName)); //相对于本地设定的基础路径 DirectoryInfo roboBasePathDI = new DirectoryInfo(ms.monitorLocalPath); if (roboBasePathDI.Exists) { //判断文件在Robocopy目标路径中是否存在 foreach (FileInfo fi in di.EnumerateFiles("*", SearchOption.AllDirectories)) { if (Signal.IsSystemStoping) { break; } //获取Robocopy目标路径 string destPath = fi.FullName.Replace(di.FullName, ms.monitorLocalPath); FileInfo targetFile = new FileInfo(destPath); //如果已经被删除,则复制 if (!targetFile.Exists) { if (!Directory.Exists(targetFile.DirectoryName)) { Directory.CreateDirectory(targetFile.DirectoryName); } File.Copy(fi.FullName, targetFile.FullName); } } } } } #endregion //探测 Robocopy目的路径中的SSH copy文件是否存在 } catch (System.Exception ex) { Common.Util.LogManager.WriteLog(Common.Util.LogFile.LocalSync, MessageUtil.GetExceptionMsg(ex, "")); } #endregion }
/// <summary> /// 扫描数据库,判断是否在mac上存在 /// </summary> /// <param name="config"></param> private void DBSync(Config config) { try { /* * 分页获取SSHPathInfo,找出mac端已经删除文件对应的id,删除对应的本地文件并刷新数据库 * * 待确定的想法:如果发现mac端文件已经更新,则更新本地文件 */ List <string> delIDList = new List <string>(); SSHPathInfoDAL spid = new SSHPathInfoDAL(); #region 主要处理 try { FileSystemUtil fsu = new FileSystemUtil(); //获取所有MonitorServer,以便于数据处理 MonitorServerDAL msd = new MonitorServerDAL(); List <MonitorServer> msList = msd.GetAllMonitorServer(config); foreach (SSHPathInfo spi in spid.GetSSHPathInfo(config)) { if (Signal.IsSystemStoping) { break; } #region 判断Mac端文件是否存在,如果不存在,则删除本地SSH输出目录中对应文件 SFTPProxy sftpProxy = null; string localSSHPath = string.Empty; try { //获取对应mac机的信息 MonitorServer ms = msList.Find(x => x.monitorServerIP.Trim().Equals(spi.MonitorServerIP.Trim()) && spi.MacPath.ToLower().Trim().Contains(x.monitorMacPath.ToLower().Trim())); if (ms != null) { sftpProxy = new SFTPProxy(ms.monitorServerIP, ms.account, ms.password); if (!sftpProxy.IsExist(spi.MacPath)) { delIDList.Add(spi.ID); #region 除SSH输出路径的本地文件 //获取本地路径 localSSHPath = GetLocalSSHPath(ms, spi.MacPath, config.Path.OutputPath); if (spi.typeflag == 0) { fsu.DeleteDir(localSSHPath); } else { //如果是文件 fsu.DeleteFile(localSSHPath); //判断目录是否为空:是否有文件 CleanLocalSSHDirectory(fsu, localSSHPath); } #endregion } } } catch (System.Exception ex) { Common.Util.LogManager.WriteLog(Common.Util.LogFile.DBSync, localSSHPath + Environment.NewLine + MessageUtil.GetExceptionMsg(ex, "")); } finally { if (sftpProxy != null) { sftpProxy.Close(); } } #endregion } } catch (System.Exception ex) { Common.Util.LogManager.WriteLog(Common.Util.LogFile.DBSync, MessageUtil.GetExceptionMsg(ex, "")); } finally { spid.Dispose(); } #endregion #region 更新数据库 spid.DeleteEntrys(config, delIDList); #endregion } catch (System.Exception ex) { Common.Util.LogManager.WriteLog(Common.Util.LogFile.DBSync, MessageUtil.GetExceptionMsg(ex, "")); } }
/// <summary> /// 判断文件是否发生变化,若变化则copy文件 /// </summary> /// <param name="config"></param> /// <param name="epi"></param> public void SSHCopy(Config config, ErrorPathInfo epi) { //获取mac端信息 MonitorServerDAL msd = new MonitorServerDAL(); MonitorServer ms = msd.GetMonitorServer(config, epi); if (ms == null) { Common.Util.LogManager.WriteLog(LogFile.Warning, "there is no MonitorServer that meet the conditions !"); return; } SFTPProxy sftpProxy = null; var sshlog = new Common.Util.SSHLogManager(); try { sftpProxy = new SFTPProxy(ms.monitorServerIP, ms.account, ms.password); #region 处理 foreach (ErrorEntry ee in epi.PathList) { string macPath = string.Empty; try { //获取mac路径 macPath = MacPathConvert(epi.source, ee.Path, ms.monitorMacPath, ms.startFile); //获取远端文件属性 SftpFile sf = sftpProxy.GetFileInfo(macPath); if (!ErrorPathFilter.IsUpdate(config, sf, ms)) { continue; } if (sf.IsDirectory) { #region 除job端已经删除的文件 #endregion foreach (SftpFile sfile in sftpProxy.Ls(sf)) { #region 过滤无关文件 if (String.Compare(sfile.Name.Trim('\r'), ".DS_Store", true) == 0 || String.Compare(sfile.Name.Trim('\r'), ".com.apple.timemachine.supported", true) == 0 || String.Compare(sfile.Name.Trim('\r'), "Icon", true) == 0) { continue; } #endregion if (!ErrorPathFilter.IsUpdate(config, sfile, ms)) { continue; } SSHCopyFile(sfile, ms, config.Path.OutputPath, sftpProxy); } } else { SSHCopyFile(sf, ms, config.Path.OutputPath, sftpProxy); } } catch (System.Exception ex) { Common.Util.LogManager.WriteLog(LogFile.Error, MessageUtil.GetExceptionMsg(ex, "")); sshlog.WriteLog(new Common.Util.SSHLog() { DateTime = DateTime.Now, LogType = Common.Util.SSHLogType.Failure, Message = ee.Path }); } } #endregion } catch (System.Exception ex) { Common.Util.LogManager.WriteLog(LogFile.Error, MessageUtil.GetExceptionMsg(ex, "")); } finally { if (sftpProxy != null) { sftpProxy.Close(); } } }