C#FTP操作

iDotNetSpace發表於2010-05-31
C# FTP操作類 收藏
using System;
using System.Collections;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;

namespace Discuz.Common
{
    ///


    /// FTP類
    ///

    public class FTP
    {
        #region 變數宣告

        ///


        /// 伺服器連線地址
        ///

        public string server;

        ///


        /// 登陸帳號
        ///

        public string user;

        ///


        /// 登陸口令
        ///

        public string pass;

        ///


        /// 埠號
        ///

        public int port;

        ///


        /// 無響應時間(FTP在指定時間內無響應)
        ///

        public int timeout;

        ///


        /// 伺服器錯誤狀態資訊
        ///

        public string errormessage;


        ///


        /// 伺服器狀態返回資訊
        ///

        private string messages;

        ///


        /// 伺服器的響應資訊
        ///

        private string responseStr;

        ///


        /// 連結模式(主動或被動,預設為被動)
        ///

        private bool passive_mode;

        ///


        /// 上傳或下載資訊位元組數
        ///

        private long bytes_total;

        ///


        /// 上傳或下載的檔案大小
        ///

        private long file_size;

        ///


        /// 主套接字
        ///

        private Socket main_sock;

        ///


        /// 要連結的網路地址終結點
        ///

        private IPEndPoint main_ipEndPoint;

        ///


        /// 偵聽套接字
        ///

        private Socket listening_sock;

        ///


        /// 資料套接字
        ///

        private Socket data_sock;

        ///


        /// 要連結的網路資料地址終結點
        ///

        private IPEndPoint data_ipEndPoint;

        ///


        /// 用於上傳或下載的檔案流物件
        ///

        private FileStream file;

        ///


        /// 與FTP伺服器互動的狀態值
        ///

        private int response;

        ///


        /// 讀取並儲存當前命令執行後從FTP伺服器端返回的資料資訊
        ///

        private string bucket;

        #endregion

        #region 建構函式

        ///


        /// 建構函式
        ///

        public FTP()
        {
            server = null;
            user = null;
            pass = null;
            port = 21;
            passive_mode = true;
            main_sock = null;
            main_ipEndPoint = null;
            listening_sock = null;
            data_sock = null;
            data_ipEndPoint = null;
            file = null;
            bucket = "";
            bytes_total = 0;
            timeout = 10000;    //無響應時間為10秒
            messages = "";
            errormessage = "";
        }

        ///


        /// 建構函式
        ///

        /// 伺服器IP或名稱
        /// 登陸帳號
        /// 登陸口令
        public FTP(string server, string user, string pass)
        {
            this.server = server;
            this.user = user;
            this.pass = pass;
            port = 21;
            passive_mode = true;
            main_sock = null;
            main_ipEndPoint = null;
            listening_sock = null;
            data_sock = null;
            data_ipEndPoint = null;
            file = null;
            bucket = "";
            bytes_total = 0;
            timeout = 10000;    //無響應時間為10秒
            messages = "";
            errormessage = "";
        }

        ///


        /// 建構函式
        ///

        /// 伺服器IP或名稱
        /// 埠號
        /// 登陸帳號
        /// 登陸口令
        public FTP(string server, int port, string user, string pass)
        {
            this.server = server;
            this.user = user;
            this.pass = pass;
            this.port = port;
            passive_mode = true;
            main_sock = null;
            main_ipEndPoint = null;
            listening_sock = null;
            data_sock = null;
            data_ipEndPoint = null;
            file = null;
            bucket = "";
            bytes_total = 0;
            timeout = 10000;    //無響應時間為10秒
            messages = "";
            errormessage = "";
        }


        ///


        /// 建構函式
        ///

        /// 伺服器IP或名稱
        /// 埠號
        /// 登陸帳號
        /// 登陸口令
        /// 連結方式
        public FTP(string server, int port, string user, string pass, int mode)
        {
            this.server = server;
            this.user = user;
            this.pass = pass;
            this.port = port;
            passive_mode = mode <= 1 ? true : false;
            main_sock = null;
            main_ipEndPoint = null;
            listening_sock = null;
            data_sock = null;
            data_ipEndPoint = null;
            file = null;
            bucket = "";
            bytes_total = 0;
            this.timeout = 10000;    //無響應時間為10秒
            messages = "";
            errormessage = "";
        }

        ///


        /// 建構函式
        ///

        /// 伺服器IP或名稱
        /// 埠號
        /// 登陸帳號
        /// 登陸口令
        /// 連結方式
        /// 無響應時間(限時),單位:秒 (小於或等於0為不受時間限制)
        public FTP(string server, int port, string user, string pass, int mode, int timeout_sec)
        {
            this.server = server;
            this.user = user;
            this.pass = pass;
            this.port = port;
            passive_mode = mode <= 1 ? true : false;
            main_sock = null;
            main_ipEndPoint = null;
            listening_sock = null;
            data_sock = null;
            data_ipEndPoint = null;
            file = null;
            bucket = "";
            bytes_total = 0;
            this.timeout = (timeout_sec <= 0) ? int.MaxValue : (timeout_sec * 1000);    //無響應時間
            messages = "";
            errormessage = "";
        }

        #endregion

        #region 屬性
        ///


        /// 當前是否已連線
        ///

        public bool IsConnected
        {
            get
            {
                if (main_sock != null)
                    return main_sock.Connected;
                return false;
            }
        }

        ///


        /// 當message緩衝區有資料則返回
        ///

        public bool MessagesAvailable
        {
            get
            {
                if (messages.Length > 0)
                    return true;
                return false;
            }
        }

        ///


        /// 獲取伺服器狀態返回資訊, 並清空messages變數
        ///

        public string Messages
        {
            get
            {
                string tmp = messages;
                messages = "";
                return tmp;
            }
        }
        ///
        /// 最新指令發出後伺服器的響應
        ///

        public string ResponseString
        {
            get
            {
                return responseStr;
            }
        }


        ///


        ///在一次傳輸中,傳送或接收的位元組數
        ///

        public long BytesTotal
        {
            get
            {
                return bytes_total;
            }
        }

        ///


        ///被下載或上傳的檔案大小,當檔案大小無效時為0
        ///

        public long FileSize
        {
            get
            {
                return file_size;
            }
        }

        ///


        /// 連結模式:
        /// true 被動模式 [預設]
        /// false: 主動模式
        ///

        public bool PassiveMode
        {
            get
            {
                return passive_mode;
            }
            set
            {
                passive_mode = value;
            }
        }

        #endregion

        #region 操作

        ///


        /// 操作失敗
        ///

        private void Fail()
        {
            Disconnect();
            errormessage += responseStr;
            //throw new Exception(responseStr);
        }

        ///


        /// 下載檔案型別
        ///

        /// true:二進位制檔案 false:字元檔案
        private void SetBinaryMode(bool mode)
        {
            if (mode)
                SendCommand("TYPE I");
            else
                SendCommand("TYPE A");

            ReadResponse();
            if (response != 200)
                Fail();
        }

        ///


        /// 傳送命令
        ///

        ///
        private void SendCommand(string command)
        {
            Byte[] cmd = Encoding.ASCII.GetBytes((command + "\r\n").ToCharArray());

            if (command.Length > 3 && command.Substring(0, 4) == "PASS")
            {
                messages = "\rPASS xxx";
            }
            else
            {
                messages = "\r" + command;
            }

            try
            {
                main_sock.Send(cmd, cmd.Length, 0);
            }
            catch (Exception ex)
            {
                try
                {
                    Disconnect();
                    errormessage += ex.Message;
                    return;
                }
                catch
                {
                    main_sock.Close();
                    file.Close();
                    main_sock = null;
                    main_ipEndPoint = null;
                    file = null;
                }
            }
        }


        private void FillBucket()
        {
            Byte[] bytes = new Byte[512];
            long bytesgot;
            int msecs_passed = 0;

            while (main_sock.Available < 1)
            {
                System.Threading.Thread.Sleep(50);
                msecs_passed += 50;
                //當等待時間到,則斷開連結
                if (msecs_passed > timeout)
                {
                    Disconnect();
                    errormessage += "Timed out waiting on server to respond.";
                    return;
                }
            }

            while (main_sock.Available > 0)
            {
                bytesgot = main_sock.Receive(bytes, 512, 0);
                bucket += Encoding.ASCII.GetString(bytes, 0, (int) bytesgot);
                System.Threading.Thread.Sleep(50);
            }
        }


        private string GetLineFromBucket()
        {
            int i;
            string buf = "";

            if ((i = bucket.IndexOf('\n')) < 0)
            {
                while (i < 0)
                {
                    FillBucket();
                    i = bucket.IndexOf('\n');
                }
            }

            buf = bucket.Substring(0, i);
            bucket = bucket.Substring(i + 1);

            return buf;
        }


        ///


        /// 返回伺服器端返回資訊
        ///

        private void ReadResponse()
        {
            string buf;
            messages = "";

            while (true)
            {
                buf = GetLineFromBucket();

                if (Regex.Match(buf, "^[0-9]+ ").Success)
                {
                    responseStr = buf;
                    response = int.Parse(buf.Substring(0, 3));
                    break;
                }
                else
                    messages += Regex.Replace(buf, "^[0-9]+-", "") + "\n";
            }
        }


        ///


        /// 開啟資料套接字
        ///

        private void OpenDataSocket()
        {
            if (passive_mode)
            {
                string[] pasv;
                string server;
                int port;

                Connect();
                SendCommand("PASV");
                ReadResponse();
                if (response != 227)
                    Fail();

                try
                {
                    int i1, i2;

                    i1 = responseStr.IndexOf('(') + 1;
                    i2 = responseStr.IndexOf(')') - i1;
                    pasv = responseStr.Substring(i1, i2).Split(',');
                }
                catch (Exception)
                {
                    Disconnect();
                    errormessage += "Malformed PASV response: " + responseStr;
                    return;
                }

                if (pasv.Length < 6)
                {
                    Disconnect();
                    errormessage += "Malformed PASV response: " + responseStr;
                    return;
                }

                server = String.Format("{0}.{1}.{2}.{3}", pasv[0], pasv[1], pasv[2], pasv[3]);
                port = (int.Parse(pasv[4]) << 8) + int.Parse(pasv[5]);

                try
                {
                    CloseDataSocket();

                    data_sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

#if NET1
                    data_ipEndPoint = new IPEndPoint(Dns.GetHostByName(server).AddressList[0], port);
#else
                    data_ipEndPoint = new IPEndPoint(System.Net.Dns.GetHostEntry(server).AddressList[0], port);
#endif

                    data_sock.Connect(data_ipEndPoint);

                }
                catch (Exception ex)
                {
                    errormessage += "Failed to connect for data transfer: " + ex.Message;
                    return;
                }
            }
            else
            {
                Connect();

                try
                {
                    CloseDataSocket();

                    listening_sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                    // 對於埠,則傳送IP地址.下面則提取相應資訊
                    string sLocAddr = main_sock.LocalEndPoint.ToString();
                    int ix = sLocAddr.IndexOf(':');
                    if (ix < 0)
                    {
                        errormessage += "Failed to parse the local address: " + sLocAddr;
                        return;
                    }
                    string sIPAddr = sLocAddr.Substring(0, ix);
                    // 系統自動繫結一個埠號(設定 port = 0)
                    System.Net.IPEndPoint localEP = new IPEndPoint(IPAddress.Parse(sIPAddr), 0);

                    listening_sock.Bind(localEP);
                    sLocAddr = listening_sock.LocalEndPoint.ToString();
                    ix = sLocAddr.IndexOf(':');
                    if (ix < 0)
                    {
                        errormessage += "Failed to parse the local address: " + sLocAddr;

                    }
                    int nPort = int.Parse(sLocAddr.Substring(ix + 1));

                    // 開始偵聽連結請求
                    listening_sock.Listen(1);
                    string sPortCmd = string.Format("PORT {0},{1},{2}",
                                                    sIPAddr.Replace('.', ','),
                                                    nPort / 256, nPort % 256);
                    SendCommand(sPortCmd);
                    ReadResponse();
                    if (response != 200)
                        Fail();
                }
                catch (Exception ex)
                {
                    errormessage += "Failed to connect for data transfer: " + ex.Message;
                    return;
                }
            }
        }


        private void ConnectDataSocket()
        {
            if (data_sock != null)        // 已連結
                return;

            try
            {
                data_sock = listening_sock.Accept();    // Accept is blocking
                listening_sock.Close();
                listening_sock = null;

                if (data_sock == null)
                {
                    throw new Exception("Winsock error: " +
                        Convert.ToString(System.Runtime.InteropServices.Marshal.GetLastWin32Error()));
                }
            }
            catch (Exception ex)
            {
                errormessage += "Failed to connect for data transfer: " + ex.Message;
            }
        }


        private void CloseDataSocket()
        {
            if (data_sock != null)
            {
                if (data_sock.Connected)
                {
                    data_sock.Close();
                }
                data_sock = null;
            }

            data_ipEndPoint = null;
        }

        ///


        /// 關閉所有連結
        ///

        public void Disconnect()
        {
            CloseDataSocket();

            if (main_sock != null)
            {
                if (main_sock.Connected)
                {
                    SendCommand("QUIT");
                    main_sock.Close();
                }
                main_sock = null;
            }

            if (file != null)
                file.Close();

            main_ipEndPoint = null;
            file = null;
        }

        ///


        /// 連結到FTP伺服器
        ///

        /// 要連結的IP地址或主機名
        /// 埠號
        /// 登陸帳號
        /// 登陸口令
        public void Connect(string server, int port, string user, string pass)
        {
            this.server = server;
            this.user = user;
            this.pass = pass;
            this.port = port;

            Connect();
        }

        ///


        /// 連結到FTP伺服器
        ///

        /// 要連結的IP地址或主機名
        /// 登陸帳號
        /// 登陸口令
        public void Connect(string server, string user, string pass)
        {
            this.server = server;
            this.user = user;
            this.pass = pass;

            Connect();
        }

        ///


        /// 連結到FTP伺服器
        ///

        public bool Connect()
        {
            if (server == null)
            {
                errormessage += "No server has been set.\r\n";
            }
            if (user == null)
            {
                errormessage += "No server has been set.\r\n";
            }

            if (main_sock != null)
                if (main_sock.Connected)
                    return true;

            try
            {
                main_sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
#if NET1
                main_ipEndPoint = new IPEndPoint(Dns.GetHostByName(server).AddressList[0], port);
#else
                main_ipEndPoint = new IPEndPoint(System.Net.Dns.GetHostEntry(server).AddressList[0], port);
#endif

                main_sock.Connect(main_ipEndPoint);
            }
            catch (Exception ex)
            {
                errormessage += ex.Message;
                return false;
            }

            ReadResponse();
            if (response != 220)
                Fail();

            SendCommand("USER " + user);
            ReadResponse();

            switch (response)
            {
            case 331:
                if (pass == null)
                {
                    Disconnect();
                    errormessage += "No password has been set.";
                    return false;
                }
                SendCommand("PASS " + pass);
                ReadResponse();
                if (response != 230)
                {
                    Fail();
                    return false;
                }
                break;
            case 230:
                break;
            }

            return true;
        }

        ///


        /// 獲取FTP當前(工作)目錄下的檔案列表
        ///

        /// 返回檔案列表陣列
        public ArrayList List()
        {
            Byte[] bytes = new Byte[512];
            string file_list = "";
            long bytesgot = 0;
            int msecs_passed = 0;
            ArrayList list = new ArrayList();

            Connect();
            OpenDataSocket();
            SendCommand("LIST");
            ReadResponse();

            switch (response)
            {
            case 125:
            case 150:
                break;
            default:
                CloseDataSocket();
                throw new Exception(responseStr);
            }
            ConnectDataSocket();

            while (data_sock.Available < 1)
            {
                System.Threading.Thread.Sleep(50);
                msecs_passed += 50;

                if (msecs_passed > (timeout / 10))
                {
                    break;
                }
            }

            while (data_sock.Available > 0)
            {
                bytesgot = data_sock.Receive(bytes, bytes.Length, 0);
                file_list += Encoding.ASCII.GetString(bytes, 0, (int) bytesgot);
                System.Threading.Thread.Sleep(50);
            }

            CloseDataSocket();

            ReadResponse();
            if (response != 226)
                throw new Exception(responseStr);

            foreach (string f in file_list.Split('\n'))
            {
                if (f.Length > 0 && !Regex.Match(f, "^total").Success)
                    list.Add(f.Substring(0, f.Length - 1));
            }

            return list;
        }

        ///


        /// 獲取到檔名列表
        ///

        /// 返回檔名列表
        public ArrayList ListFiles()
        {
            ArrayList list = new ArrayList();

            foreach (string f in List())
            {
                if ((f.Length > 0))
                {
                    if ((f[0] != 'd') && (f.ToUpper().IndexOf("

") < 0))
                        list.Add(f);
                }
            }

            return list;
        }

        ///


        /// 獲取路徑列表
        ///

        /// 返回路徑列表
        public ArrayList ListDirectories()
        {
            ArrayList list = new ArrayList();

            foreach (string f in List())
            {
                if (f.Length > 0)
                {
                    if ((f[0] == 'd') || (f.ToUpper().IndexOf("

") >= 0))
                        list.Add(f);
                }
            }

            return list;
        }

        ///


        /// 獲取原始資料資訊.
        ///

        /// 遠端檔名
        /// 返回原始資料資訊.
        public string GetFileDateRaw(string fileName)
        {
            Connect();

            SendCommand("MDTM " + fileName);
            ReadResponse();
            if (response != 213)
            {
                errormessage += responseStr;
                return "";
            }

            return (this.responseStr.Substring(4));
        }

        ///


        /// 得到檔案日期.
        ///

        /// 遠端檔名
        /// 返回遠端檔案日期
        public DateTime GetFileDate(string fileName)
        {
            return ConvertFTPDateToDateTime(GetFileDateRaw(fileName));
        }

        private DateTime ConvertFTPDateToDateTime(string input)
        {
            if (input.Length < 14)
                throw new ArgumentException("Input Value for ConvertFTPDateToDateTime method was too short.");

            //YYYYMMDDhhmmss":
            int year = Convert.ToInt16(input.Substring(0, 4));
            int month = Convert.ToInt16(input.Substring(4, 2));
            int day = Convert.ToInt16(input.Substring(6, 2));
            int hour = Convert.ToInt16(input.Substring(8, 2));
            int min = Convert.ToInt16(input.Substring(10, 2));
            int sec = Convert.ToInt16(input.Substring(12, 2));

            return new DateTime(year, month, day, hour, min, sec);
        }

        ///


        /// 獲取FTP上的當前(工作)路徑
        ///

        /// 返回FTP上的當前(工作)路徑
        public string GetWorkingDirectory()
        {
            //PWD - 顯示工作路徑
            Connect();
            SendCommand("PWD");
            ReadResponse();

            if (response != 257)
            {
                errormessage += responseStr;
            }

            string pwd;
            try
            {
                pwd = responseStr.Substring(responseStr.IndexOf("\"", 0) + 1);//5);
                pwd = pwd.Substring(0, pwd.LastIndexOf("\""));
                pwd = pwd.Replace("\"\"", "\""); // 替換帶引號的路徑資訊符號
            }
            catch (Exception ex)
            {
                errormessage += ex.Message;
                return null;
            }

            return pwd;
        }


        ///


        /// 跳轉伺服器上的當前(工作)路徑
        ///

        /// 要跳轉的路徑
        public bool ChangeDir(string path)
        {
            Connect();
            SendCommand("CWD " + path);
            ReadResponse();
            if (response != 250)
            {
                errormessage += responseStr;
                return false;
            }
            return true;
        }

        ///


        /// 建立指定的目錄
        ///

        /// 要建立的目錄
        public void MakeDir(string dir)
        {
            Connect();
            SendCommand("MKD " + dir);
            ReadResponse();

            switch (response)
            {
            case 257:
            case 250:
                break;
            default:
                {
                    errormessage += responseStr;
                    break;
                }
            }
        }

        ///


        /// 移除FTP上的指定目錄
        ///

        /// 要移除的目錄
        public void RemoveDir(string dir)
        {
            Connect();
            SendCommand("RMD " + dir);
            ReadResponse();
            if (response != 250)
            {
                errormessage += responseStr;
                return;
                ;
            }
        }

        ///


        /// 移除FTP上的指定檔案
        ///

        /// 要移除的檔名稱
        public void RemoveFile(string filename)
        {
            Connect();
            SendCommand("DELE " + filename);
            ReadResponse();
            if (response != 250)
            {
                errormessage += responseStr;
            }
        }

        ///


        /// 重新命名FTP上的檔案
        ///

        /// 原檔名
        /// 新檔名
        public void RenameFile(string oldfilename, string newfilename)
        {
            Connect();
            SendCommand("RNFR " + oldfilename);
            ReadResponse();
            if (response != 350)
            {
                errormessage += responseStr;
            }
            else
            {
                SendCommand("RNTO " + newfilename);
                ReadResponse();
                if (response != 250)
                {
                    errormessage += responseStr;
                }
            }
        }

        ///


        /// 獲得指定檔案的大小(如果FTP支援)
        ///

        /// 指定的檔案
        /// 返回指定檔案的大小
        public long GetFileSize(string filename)
        {
            Connect();
            SendCommand("SIZE " + filename);
            ReadResponse();
            if (response != 213)
            {
                errormessage += responseStr;
            }

            return Int64.Parse(responseStr.Substring(4));
        }

        ///


        /// 上傳指定的檔案
        ///

        /// 要上傳的檔案
        public bool OpenUpload(string filename)
        {
            return OpenUpload(filename, filename, false);
        }

        ///


        /// 上傳指定的檔案
        ///

        /// 本地檔名
        /// 遠端要覆蓋的檔名
        public bool OpenUpload(string filename, string remotefilename)
        {
            return OpenUpload(filename, remotefilename, false);
        }

        ///


        /// 上傳指定的檔案
        ///

        /// 本地檔名
        /// 如果存在,則嘗試恢復
        public bool OpenUpload(string filename, bool resume)
        {
            return OpenUpload(filename, filename, resume);
        }

        ///


        /// 上傳指定的檔案
        ///

        /// 本地檔名
        /// 遠端要覆蓋的檔名
        /// 如果存在,則嘗試恢復
        public bool OpenUpload(string filename, string remote_filename, bool resume)
        {
            Connect();
            SetBinaryMode(true);
            OpenDataSocket();

            bytes_total = 0;

            try
            {
                file = new FileStream(filename, FileMode.Open);
            }
            catch (Exception ex)
            {
                file = null;
                errormessage += ex.Message;
                return false;
            }

            file_size = file.Length;

            if (resume)
            {
                long size = GetFileSize(remote_filename);
                SendCommand("REST " + size);
                ReadResponse();
                if (response == 350)
                    file.Seek(size, SeekOrigin.Begin);
            }

            SendCommand("STOR " + remote_filename);
            ReadResponse();

            switch (response)
            {
            case 125:
            case 150:
                break;
            default:
                file.Close();
                file = null;
                errormessage += responseStr;
                return false;
            }
            ConnectDataSocket();

            return true;
        }

        ///


        /// 下載指定檔案
        ///

        /// 遠端檔名稱
        public void OpenDownload(string filename)
        {
            OpenDownload(filename, filename, false);
        }

        ///


        /// 下載並恢復指定檔案
        ///

        /// 遠端檔名稱
        /// 如檔案存在,則嘗試恢復
        public void OpenDownload(string filename, bool resume)
        {
            OpenDownload(filename, filename, resume);
        }

        ///


        /// 下載指定檔案
        ///

        /// 遠端檔名稱
        /// 本地檔名
        public void OpenDownload(string remote_filename, string localfilename)
        {
            OpenDownload(remote_filename, localfilename, false);
        }

        ///


        /// 開啟並下載檔案
        ///

        /// 遠端檔名稱
        /// 本地檔名
        /// 如果檔案存在則恢復
        public void OpenDownload(string remote_filename, string local_filename, bool resume)
        {
            Connect();
            SetBinaryMode(true);

            bytes_total = 0;

            try
            {
                file_size = GetFileSize(remote_filename);
            }
            catch
            {
                file_size = 0;
            }

            if (resume && File.Exists(local_filename))
            {
                try
                {
                    file = new FileStream(local_filename, FileMode.Open);
                }
                catch (Exception ex)
                {
                    file = null;
                    throw new Exception(ex.Message);
                }

                SendCommand("REST " + file.Length);
                ReadResponse();
                if (response != 350)
                    throw new Exception(responseStr);
                file.Seek(file.Length, SeekOrigin.Begin);
                bytes_total = file.Length;
            }
            else
            {
                try
                {
                    file = new FileStream(local_filename, FileMode.Create);
                }
                catch (Exception ex)
                {
                    file = null;
                    throw new Exception(ex.Message);
                }
            }

            OpenDataSocket();
            SendCommand("RETR " + remote_filename);
            ReadResponse();

            switch (response)
            {
            case 125:
            case 150:
                break;
            default:
                file.Close();
                file = null;
                errormessage += responseStr;
                return;
            }
            ConnectDataSocket();

            return;
        }

        ///


        /// 上傳檔案(迴圈呼叫直到上傳完畢)
        ///

        /// 傳送的位元組數
        public long DoUpload()
        {
            Byte[] bytes = new Byte[512];
            long bytes_got;

            try
            {
                bytes_got = file.Read(bytes, 0, bytes.Length);
                bytes_total += bytes_got;
                data_sock.Send(bytes, (int) bytes_got, 0);

                if (bytes_got <= 0)
                {
                    //上傳完畢或有錯誤發生
                    file.Close();
                    file = null;

                    CloseDataSocket();
                    ReadResponse();
                    switch (response)
                    {
                    case 226:
                    case 250:
                        break;
                    default: //當上傳中斷時
                        {
                            errormessage += responseStr;
                            return -1;
                        }
                    }

                    SetBinaryMode(false);
                }
            }
            catch (Exception ex)
            {
                file.Close();
                file = null;
                CloseDataSocket();
                ReadResponse();
                SetBinaryMode(false);
                //throw ex;
                //當上傳中斷時
                errormessage += ex.Message;
                return -1;
            }

            return bytes_got;
        }

        ///


        /// 下載檔案(迴圈呼叫直到下載完畢)
        ///

        /// 接收到的位元組點
        public long DoDownload()
        {
            Byte[] bytes = new Byte[512];
            long bytes_got;

            try
            {
                bytes_got = data_sock.Receive(bytes, bytes.Length, 0);

                if (bytes_got <= 0)
                {
                    //下載完畢或有錯誤發生
                    CloseDataSocket();
                    file.Close();
                    file = null;

                    ReadResponse();
                    switch (response)
                    {
                    case 226:
                    case 250:
                        break;
                    default:
                        {
                            errormessage += responseStr;
                            return -1;
                        }
                    }

                    SetBinaryMode(false);

                    return bytes_got;
                }

                file.Write(bytes, 0, (int) bytes_got);
                bytes_total += bytes_got;
            }
            catch (Exception ex)
            {
                CloseDataSocket();
                file.Close();
                file = null;
                ReadResponse();
                SetBinaryMode(false);
                //throw ex;
                //當下載中斷時
                errormessage += ex.Message;
                return -1;
            }

            return bytes_got;
        }

        #endregion
    }
}簡單使用示例:using System;
using System.Collections;
using System.IO;
using Discuz.Common;

namespace Test
{
    class TestFtp
    {
        public void Test()
        {
            FTP ftp = new FTP("127.0.0.1", "abc", "123456");

            //建立資料夾
      

    ftp.MakeDir("com");
            ftp.ChangeDir("com");
            ftp.MakeDir("mzwu");
            ftp.ChangeDir("mzwu");

            //資料夾列表
            ArrayList list =   ftp.ListDirectories();

            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine(list[i].ToString() + "
");
            }

            //刪除資料夾(不能直接刪除非空資料夾)
           ftp.RemoveDir("com\\mzwu");
            //上傳檔案
             ftp.Connect();
             ftp.OpenUpload(@"F:\mzwucom.jpg", Path.GetFileName(@"F:\mzwucom.jpg"));
            while (ftp.DoUpload() > 0)
            {
                int perc = (int) (((ftp.BytesTotal) * 100) / http://www.cnblogs.com/MikeChen/admin/ftp://ftp.filesize/);
                Console.WriteLine(perc.ToString() + "%
");
            }
            ftp.Disconnect();

            //下載檔案
            http://www.cnblogs.com/MikeChen/admin/ftp://ftp.connect/();
            http://www.cnblogs.com/MikeChen/admin/ftp://ftp.opendownload(%22mzwucom.jpg/", @"E:\mzwucom.jpg");
            while (http://www.cnblogs.com/MikeChen/admin/ftp://ftp.dodownload/() > 0)
            {
                int perc = (int) (((http://www.cnblogs.com/MikeChen/admin/ftp://ftp.bytestotal/) * 100) / http://www.cnblogs.com/MikeChen/admin/ftp://ftp.filesize/);
                Console.WriteLine(perc.ToString() + "%
");
            }
            http://www.cnblogs.com/MikeChen/admin/ftp://ftp.disconnect/();

            //檔案列表
             list = http://www.cnblogs.com/MikeChen/admin/ftp://ftp.listfiles/();
            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine(list[i].ToString() + "
");
            }

            //檔案重新命名
            http://www.cnblogs.com/MikeChen/admin/ftp://ftp.renamefile(%22mzwucom.jpg/", "test.jpg");

            //刪除檔案
            http://www.cnblogs.com/MikeChen/admin/ftp://ftp.removefile(%22test.jpg/");

            //顯示錯誤資訊
            Console.WriteLine(http://www.cnblogs.com/MikeChen/admin/ftp://ftp.errormessage/);
        }

    }
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-664119/,如需轉載,請註明出處,否則將追究法律責任。