記錄 FTP組件的一個類

在公司的生產環境中文件傳輸是必不可少的;對於要開發 一個FTP工具來說這是必需用到的技能;

以下代碼用於記錄;時間:2018-12-6 21:59:35

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Collections;

namespace FTPClass
{
    public class FTP
    {
        #region 內部變量
        private string serverhost;
        private string serveruser;
        private string serverpass;
        #endregion

        #region 構造函數
        /// <summary>
        /// 構造函數
        /// </summary>
        /// <param name="serverhost">FTP服務器IP地址</param>
        /// <param name="serveruser">用戶名</param>
        /// <param name="serverpass">密碼</param>
        public FTP(string serverIP, string User, string Pass)
        {
            serverhost = serverIP;
            serveruser = User;
            serverpass = Pass;

        }
        #endregion

        #region 方法

        /// <summary>
        /// 檢查服務器上是否存在某個文件
        /// </summary>
        /// <param name="RemoteFile">服務器上的某個文件</param>
        /// <returns></returns>
        /// <!--文件路徑要從根路徑開始-->
        public bool FileExists(string RemoteFile)
        {
            string path=RemoteFile.Substring(0,RemoteFile.LastIndexOf("/")+1);
            string file=RemoteFile.Substring(RemoteFile.LastIndexOf("/")+1,RemoteFile.Length-RemoteFile.LastIndexOf("/")-1);

            try
            {
                FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + serverhost + "/" + path));

                ftp.UseBinary = true;
                ftp.KeepAlive = false;
                ftp.Credentials = new NetworkCredential(serveruser, serverpass);
                ftp.Method = WebRequestMethods.Ftp.ListDirectory;
                FtpWebResponse response = ftp.GetResponse() as FtpWebResponse;
                StreamReader str = new StreamReader(response.GetResponseStream(), Encoding.Default, true);

                string strline = string.Empty;
                while ((strline = str.ReadLine()) != null)
                {
                    if (strline == file)
                    {
                        str.Close();
                        response.Close();
                        return true;
                    }
                }

                str.Close();
                response.Close();

            }
            catch (WebException we)
            {
                return false;
            }
            catch (Exception ex)
            {
                throw new Exception("查詢文件是否存在失敗,錯誤信息:" + ex.Message);
            }
            return false;

        }

       /// <summary>
       /// 檢測某個路徑是否存在
       /// </summary>
       /// <param name="RemoteDir">服務器上的路徑</param>
       /// <returns></returns>
        public bool DirExists(string RemoteDir)
        {
            string foldername = "";
            string str= RemoteDir.Substring(0, RemoteDir.LastIndexOf("/"));
            try
            {
                FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + serverhost + "/" + str));
                ftp.UseBinary = true;
                ftp.UsePassive = true;
                ftp.Credentials = new NetworkCredential(serveruser, serverpass);
                ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
                FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();

                Stream stream = response.GetResponseStream();
                StreamReader reader = new StreamReader(stream, System.Text.Encoding.Default);

                if (reader != null)
                {
                    foldername = reader.ReadToEnd();
                }
                
                response.Close();
                stream.Close();
                reader.Close();

                if (foldername == "")
                    return false;
                else
                    return true;

            }
            catch (WebException we)
            {
                return false;
            }
            catch (Exception ex)
            {
                throw new Exception("檢測路徑是否存在失敗,錯誤信息:" + ex.Message);
            }
          
        }

        /// <summary>
        /// 上傳文件
        /// </summary>
        /// <param name="LocalFile">本地文件</param>
        /// <param name="RemoteFile">服務器上的文件</param>
        public void UpLoadFile(string LocalFile, string RemoteFile)
        {
            FileInfo fi = new FileInfo(LocalFile);
            FtpWebRequest ftp;
            ftp = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + serverhost + "/" + RemoteFile));
            ftp.UseBinary = true;
            ftp.KeepAlive = false;
            ftp.Credentials = new NetworkCredential(serveruser, serverpass);
            ftp.Method = WebRequestMethods.Ftp.UploadFile;
            ftp.ContentLength = fi.Length;
            int BufLength = 2048;
            byte[] buff = new byte[BufLength];
            int ConntLength;
            FileStream fs = fi.OpenRead();
            try
            {
                Stream strm = ftp.GetRequestStream();
                ConntLength = fs.Read(buff, 0, BufLength);
                while (ConntLength != 0)
                {
                    strm.Write(buff, 0, ConntLength);
                    ConntLength = fs.Read(buff, 0, BufLength);
                }
                strm.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("上傳文件失敗,錯誤信息:" + ex.Message);
            }
            finally
            {
                fs.Close();
            }
        }

        /// <summary>
        /// 上傳文件夾
        /// </summary>
        /// <param name="LocalDir">本地文件夾</param>
        /// <param name="RemoteDir">服務器文件夾</param>
        public void UpLoadFolder(string LocalDir, string RemoteDir)
        {
            string LocalPath;
            string RemotePath;
            if (Directory.Exists(LocalDir))
            {
                DirectoryInfo di = new DirectoryInfo(LocalDir);
                FileInfo[] files = di.GetFiles();
                if (files.Length > 0)
                {
                    foreach(FileInfo file in files)
                    {
                        LocalPath = LocalDir + file;
                        RemotePath = RemoteDir + file;
                        if (!DirExists(RemoteDir))
                        {
                            MakeDir(RemoteDir);
                        }
                        UpLoadFile(LocalPath, RemotePath);
                    }
                }
                DirectoryInfo[] dirs = di.GetDirectories();
                if (dirs.Length > 0)
                {
                    foreach (DirectoryInfo dir in dirs)
                    {
                        LocalPath = LocalDir + dir + "//";
                        RemotePath = RemoteDir + dir + "/";
                        UpLoadFolder(LocalPath, RemotePath);
                    }
                }

            }
            else
            {
                throw new Exception("上傳文件夾失敗,本地文件夾不存在");
            }

        }

        public void DnLoadFile(string RemoteFile, string LocalFile)
        {
            FtpWebRequest ftp;

            try
            {
                FileStream outputStream = new FileStream(LocalFile, FileMode.Create);

                ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + serverhost + "/" + RemoteFile));

                ftp.Method = WebRequestMethods.Ftp.DownloadFile;

                ftp.UseBinary = true;
                ftp.KeepAlive = false;


                ftp.Credentials = new NetworkCredential(serveruser, serverpass);

                FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();

                Stream ftpStream = response.GetResponseStream();

                long cl = response.ContentLength;

                int bufferSize = 2048;

                int readCount;

                byte[] buffer = new byte[bufferSize];

                readCount = ftpStream.Read(buffer, 0, bufferSize);

                while (readCount > 0)
                {
                    outputStream.Write(buffer, 0, readCount);

                    readCount = ftpStream.Read(buffer, 0, bufferSize);
                }

                ftpStream.Close();

                outputStream.Close();

                response.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("下載文件失敗,錯誤信息:" + ex.Message);
            }


        }

        public void DnLoadFolder(string RemoteDir, string LocalDir)
        {
            ArrayList files = new ArrayList();
            try
            {
                files=ListFiles(RemoteDir);
                foreach (string file in files)
                {
                    string RemoteFile=RemoteDir+file;
                    string LocalFile=LocalDir+file;
                    DnLoadFile(RemoteFile, LocalFile);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("下載文件夾失敗,錯誤信息:" + ex.Source + "," + ex.Message);
            }
        }

        public void DeleteFile(string RemoteFile)
        {
            try
            {
                FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + serverhost + "/" + RemoteFile));
                ftp.UseBinary = true;
                ftp.KeepAlive = false;
                ftp.Method = WebRequestMethods.Ftp.DeleteFile;
                ftp.Credentials = new NetworkCredential(serveruser, serverpass);
                FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
                response.Close();

            }
            catch (Exception ex)
            {
                throw new Exception("刪除文件失敗,錯誤信息:" + ex.Message);
            }


        }

        public void DeleteDir(string RemoteDir)
        {
            try
            {
                FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + serverhost + "/" + RemoteDir));
                ftp.UseBinary = true;
                ftp.KeepAlive = false;
                ftp.Method = WebRequestMethods.Ftp.RemoveDirectory;
                ftp.Credentials = new NetworkCredential(serveruser, serverpass);
                FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
                response.Close();

            }
            catch (Exception ex)
            {
                throw new Exception("刪除文件夾失敗,錯誤信息:" + ex.Message);
            }

        }

        public void MakeDir(string RemoteDir)
        {
            try
            {
                FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + serverhost + "/" + RemoteDir));
                ftp.UseBinary = true;
                ftp.KeepAlive = false;
                ftp.Method = WebRequestMethods.Ftp.MakeDirectory;
                ftp.Credentials = new NetworkCredential(serveruser, serverpass);
                FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
                response.Close();

            }
            catch (Exception ex)
            {
                throw new Exception("創建文件夾失敗,錯誤信息:" + ex.Message);
            }
        }

        public ArrayList ListFiles(string RemoteDir)
        {
            ArrayList Files = new ArrayList();
            try
            {
                FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + serverhost + "/" + RemoteDir));
                ftp.UseBinary = true;
                ftp.KeepAlive = false;
                ftp.Credentials = new NetworkCredential(serveruser, serverpass);
                ftp.Method = WebRequestMethods.Ftp.ListDirectory;
                WebResponse response = ftp.GetResponse();
                StreamReader str = new StreamReader(response.GetResponseStream(), Encoding.Default, true);

                string strline = string.Empty;
                while ((strline = str.ReadLine()) != null)
                {
                    Files.Add(strline);
                }

                str.Close();
                response.Close();
            }
            catch (WebException we)
            {
                return Files;
            }
            catch (Exception ex)
            {
                throw new Exception("列舉文件失敗,錯誤信息:" + ex.Source + "," + ex.Message);
            }
           
            return Files;
                 

        }
        #endregion
    }
}
 

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