最近需要做站点迁移,但是服务器间拷贝站点,经常出问题,只要一按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机器上要访问的目录设成共享目录