C#實現不同ftp服務器間文件(夾)同步
圖1 實現不同ftp服務器間文件(夾)同步的實現思路圖
/// <summary> /// 將文件夾1從ftp服務器1移到ftp服務器2文件夾2 /// </summary> /// <param name="sFtpUriD">源ftp url:ftp://ip+port</param> /// <param name="sFilePathD">源ftp 文件路徑:/xxx/xxx/xxx</param> /// <param name="sFtpUserD">源ftp用戶名</param> /// <param name="sFtpPwdD">源ftp密碼</param> /// <param name="sFtpUriU">目的ftp url:ftp://ip+port</param> /// <param name="sFilePathU">目的ftp 文件路徑:/xxx/xxx/xxx</param> /// <param name="sFtpUserU">目的ftp用戶名</param> /// <param name="sFtpPwdU">目的ftp密碼</param> /// <returns></returns> public bool MoveFolderOnDiffFtp(string sFtpUriD, string sFolderPathD, string sFtpUserD, string sFtpPwdD, string sFtpUriU, string sFolderPathU, string sFtpUserU, string sFtpPwdU) { //獲取文件夾中的詳細文件列表信息(包括文件大小信息) string[] sFileNameArr = GetFileList(sFtpUriD + sFolderPathD, WebRequestMethods.Ftp.ListDirectoryDetails, sFtpUserD, sFtpPwdD); //判斷是否為單個文件 if (sFileNameArr.Length <= 2) //文件夾中存在單文件 { //在ftp服務器2上創建文件夾 FtpCheckDirectoryExist(sFtpUriU + "/", sFolderPathU + "/", sFtpUserU, sFtpPwdU); if (sFileNameArr[sFileNameArr.Length - 1] == "") { string[] onlyname = GetFileList(sFtpUriD + sFolderPathD, WebRequestMethods.Ftp.ListDirectory, sFtpUserD, sFtpPwdD); foreach (string onlynames in onlyname) { if (onlynames == "" || onlynames == " ") { break; } else { MoveFileOnDiffFtp(sFtpUriD, sFolderPathD + "/" + onlynames, sFtpUserD, sFtpPwdD, sFtpUriU, sFolderPathU + "/" + onlynames, sFtpUserU, sFtpPwdU); break; } } } } else //文件夾中存在多文件或子文件夾 { //在ftp服務器2上創建文件夾 FtpCheckDirectoryExist(sFtpUriU + "/", sFolderPathU + "/", sFtpUserU, sFtpPwdU); foreach (string sFileName in sFileNameArr) { //判斷是否具有文件夾標識<DIR> if (sFileName.Contains("<DIR>")) { string sInnerFloder = sFileName.Split(new string[] { "<DIR>" }, StringSplitOptions.None)[1].Trim(); MoveFolderOnDiffFtp(sFtpUriD, sFolderPathD + "/" + sInnerFloder, sFtpUserD, sFtpPwdD, sFtpUriU, sFolderPathU + "/" + sInnerFloder, sFtpUserU, sFtpPwdU); //遞歸文件夾中的子文件夾 } else { string[] onlyname = GetFileList(sFtpUriD + sFolderPathD, WebRequestMethods.Ftp.ListDirectory, sFtpUserD, sFtpPwdD); foreach (string onlynames in onlyname) { if (onlynames == "" || onlynames == " " || sFileName == "") { break; } else { if (sFileName.Contains(" " + onlynames)) { MoveFileOnDiffFtp(sFtpUriD, sFolderPathD + "/" + onlynames, sFtpUserD, sFtpPwdD, sFtpUriU, sFolderPathU + "/" + onlynames, sFtpUserU, sFtpPwdU); break; } } } } } } return true; } /// <summary> /// 將文件從ftp服務器1移到ftp服務器2文件 /// </summary> /// <param name="sFtpUriD">源ftp url:ftp://ip+port</param> /// <param name="sFilePathD">源ftp 文件路徑:/xxx/xxx/xxx</param> /// <param name="sFtpUserD">源ftp用戶名</param> /// <param name="sFtpPwdD">源ftp密碼</param> /// <param name="sFtpUriU">目的ftp url:ftp://ip+port</param> /// <param name="sFilePathU">目的ftp 文件路徑:/xxx/xxx/xxx</param> /// <param name="sFtpUserU">目的ftp用戶名</param> /// <param name="sFtpPwdU">目的ftp密碼</param> /// <returns></returns> public bool MoveFileOnDiffFtp(string sFtpUriD, string sFilePathD, string sFtpUserD, string sFtpPwdD, string sFtpUriU, string sFilePathU, string sFtpUserU, string sFtpPwdU) { try { //在目的ftp服務器上創建文件夾 string sFolderPathU = sFilePathU.Substring(0, sFilePathU.LastIndexOf("/")); FtpCheckDirectoryExist(sFtpUriU + "/", sFolderPathU + "/", sFtpUserU, sFtpPwdU); //1.從源ftp服務器1下載 FtpWebRequest reqFtpDownload; reqFtpDownload = (FtpWebRequest)FtpWebRequest.Create(new Uri(sFtpUriD + sFilePathD)); reqFtpDownload.Credentials = new NetworkCredential(sFtpUserD, sFtpPwdD); reqFtpDownload.Method = WebRequestMethods.Ftp.DownloadFile; //下載方法 reqFtpDownload.KeepAlive = false; reqFtpDownload.UseBinary = true; reqFtpDownload.Proxy = null; FtpWebResponse response = (FtpWebResponse)reqFtpDownload.GetResponse(); //將從服務器1下載的響應流直接作為上傳到服務器2的上傳流 Stream stream = response.GetResponseStream(); //2.上傳到目的ftp服務器2 FtpWebRequest reqFTPUpload; reqFTPUpload = (FtpWebRequest)FtpWebRequest.Create(new Uri(sFtpUriU + sFilePathU)); reqFTPUpload.Credentials = new NetworkCredential(sFtpUserU, sFtpPwdU); reqFTPUpload.Method = WebRequestMethods.Ftp.UploadFile; //上傳方法 reqFTPUpload.KeepAlive = false; reqFTPUpload.UseBinary = true; reqFTPUpload.Proxy = null; int buffLength = 2048; //每次讀入文件流2kb byte[] buff = new byte[buffLength]; Stream requestStream = reqFTPUpload.GetRequestStream(); int len = stream.Read(buff, 0, buff.Length); //文件大小 while (len > 0) { requestStream.Write(buff, 0, len); len = stream.Read(buff, 0, buffLength); } stream.Close(); requestStream.Close(); stream.Dispose();//釋放資源 requestStream.Dispose();//釋放資源return true; } catch (Exception ex) { return false; } } /// <summary> /// 獲取ftp上文件夾中的文件(夾)列表信息 /// </summary> /// <param name="sFloderPath">ftp路徑</param> /// <param name="type">獲取列表的類型(詳細或只有文件名)</param> /// <param name="sFtpUser">ftp用戶名</param> /// <param name="sFtpPwd">ftp密碼</param> /// <returns></returns> private string[] GetFileList(string sFloderPath, string type ,string sFtpUser,string sFtpPwd) { WebResponse webresp = null; StreamReader ftpFileListReader = null; FtpWebRequest ftpRequest = null; StringBuilder str = new StringBuilder(); try { ftpRequest = (FtpWebRequest)WebRequest.Create(new Uri(sFloderPath)); ftpRequest.Credentials = new NetworkCredential(sFtpUser, sFtpPwd); ftpRequest.Method = type; webresp = ftpRequest.GetResponse(); ftpFileListReader = new StreamReader(webresp.GetResponseStream(), Encoding.UTF8); string line = ftpFileListReader.ReadLine(); while (line != null) { str.Append(line); str.Append("/n"); line = ftpFileListReader.ReadLine(); } } catch (Exception ex) {} return str.ToString().Split(new string[] { "/n" }, StringSplitOptions.None); } /// <summary> /// 判斷文件的目錄是否存,不存則創建 /// </summary> /// <param name="destFilePath"></param> private static void FtpCheckDirectoryExist(string strFtpURI, string destFilePath, string strFtpUserID, string strFtpPassword) { string fullDir = destFilePath.Substring(0, destFilePath.LastIndexOf("/")); string[] dirs = fullDir.Split('/'); string curDir = ""; for (int i = 0; i < dirs.Length; i++) { string dir = dirs[i]; //如果是以/開始的路徑,第一個為空 if (dir != null && dir.Length > 0) { try { curDir += dir + "/"; FtpMakeDir(strFtpURI, curDir, strFtpUserID, strFtpPassword); } catch (Exception) {} } } } /// <summary> /// 創建ftp目錄 /// </summary> private static Boolean FtpMakeDir(string strFtpURI, string destFilePath, string strFtpUserID, string strFtpPassword) { FtpWebRequest req = (FtpWebRequest)WebRequest.Create(strFtpURI + destFilePath); req.Credentials = new NetworkCredential(strFtpUserID, strFtpPassword); req.Proxy = null; req.KeepAlive = false; req.Method = WebRequestMethods.Ftp.MakeDirectory;//請求方法為創建目錄方法 req.UseBinary = true; FtpWebResponse response = req.GetResponse() as FtpWebResponse; Stream ftpStream = response.GetResponseStream(); ftpStream.Close(); response.Close(); req.Abort(); return true; }
......