最近需要做站點遷移,但是服務器間拷貝站點,經常出問題,只要一按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機器上要訪問的目錄設成共享目錄