C#實現服務器間文件傳輸

最近需要做站點遷移,但是服務器間拷貝站點,經常出問題,只要一按Ctrl+V,就報錯。後來大家建議寫個程序來實現批量拷貝,所以就展示下代碼,講下坑


界面

wKioL1ZSwfuiL4e1AACBF4QxbpI230.png

代碼:

 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機器上要訪問的目錄設成共享目錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章