C# 實現文件(夾)在ftp服務器間的同步【無需將文件(夾)保存到本地】


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;
        }    

......


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM