最近需要做站点迁移,但是服务器间拷贝站点,经常出问题,只要一按Ctrl+V,就报错。后来大家建议写个程序来实现批量拷贝,所以就展示下代码,讲下坑

界面

代码:

 private void runbutton_Click(object sender, EventArgs e)        {            string srcIP = srctb.Text;            string desIP = destb.Text;            string siteListStr = sitelisttb.Text;            string [] siteList = siteListStr.Split(';');            logtb.Text = "";            foreach(string site in siteList)            {                if (!site.Equals(""))                {                    StringBuilder log = FileUtils.CopySite(srcIP, desIP, site);                    logtb.Text = logtb.Text + log;                }            }        }

using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CopySite{    public class FileUtils    {        public static StringBuilder CopySite(string srcIp, string desIp, string site)        {                     string srcpath = System.IO.Path.Combine("\\\\", srcIp, "WebSites", site);            string despath = System.IO.Path.Combine("\\\\", desIp, "WebSites", site);            bool overwrite=true;             StringBuilder log=new StringBuilder();            CopyDir(srcpath, despath, overwrite, ref  log);            return log;        }        public static void CopyDir(string srcpath, string despath, bool overwrite, ref StringBuilder log)        {            if (!Directory.Exists(srcpath))            {                log.AppendLine(srcpath+"不存在");                return;            }            // 判断文件夹存不存在            if (!Directory.Exists(despath))            {                Directory.CreateDirectory(despath);                log.AppendLine( despath+"创建成功");            }            // 复制文件            string[] files = System.IO.Directory.GetFiles(srcpath);            foreach (string s in files)            {                //仅返回路径字符串的文件名及后缀                string fileName = System.IO.Path.GetFileName(s);                string destFile = System.IO.Path.Combine(despath, fileName);                CopyFile(s, destFile, overwrite);                log.AppendLine(destFile + "拷贝成功");            }            //复制Dir            string[] dirs = Directory.GetDirectories(srcpath);            foreach (string dir in dirs)            {                string dirName = System.IO.Path.GetFileName(dir);                string newdespath = System.IO.Path.Combine(despath, dirName);                CopyDir(dir, newdespath, overwrite, ref log);            }        }        public static void CopyFile(string srcpath,string despath,bool overwrite)        {            File.Copy(srcpath, despath, overwrite);        }    }}

假设:需要实现从A拷贝文件到B

坑1:在本地执行该代码,提示目标源访问不了

原因:我本机在上海的域中,源机子跟目标机子都在南通的域中,不同域之间访问存在问题(虽然手动是可以拷贝的)

坑2:把程序放到B机器上运行,还是报目标源访问不了

原因:A上有DMZ访问限制,所以B机器上代码访问不了A

正确解决方法:程序运行在A机器上,并且把B机器上要访问的目录设成共享目录