您当前的位置: 首页 >  c#

衣舞晨风

暂无认证

  • 0浏览

    0关注

    1156博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C# 上传下载ftp(支持断点续传)

衣舞晨风 发布时间:2015-11-25 18:51:35 ,浏览量:0

本文整理自网络,由于太多文章类似,此处标识其中一处:点击打开链接

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

namespace JianKunKing.Common.Ftp
{
    /// 
    /// FTP Client(不允许匿名登录)
    /// 上传、下载已测试,其余未测试
    /// 
    public class FTPClient
    {
        #region 构造函数
        /// 
        /// 缺省构造函数
        /// 
        public FTPClient()
        {
            this.ftpServerIP = "";
            this.remoteFilePath = "";
            this.ftpUserID = "";
            this.ftpPassword = "";
            this.ftpServerPort = 21;
            this.bConnected = false;
        }

        /// 
        /// 构造函数
        /// 
        /// FTP服务器IP地址
        /// 当前服务器目录
        /// Ftp 服务器登录用户账号
        /// Ftp 服务器登录用户密码
        /// FTP服务器端口
        public FTPClient(string ftpServerIP, string remoteFilePath, string ftpUserID, string ftpPassword, int ftpServerPort, bool anonymousAccess = false)
        {
            this.ftpServerIP = ftpServerIP;
            this.remoteFilePath = remoteFilePath;
            this.ftpUserID = ftpUserID;
            this.ftpPassword = ftpPassword;
            this.ftpServerPort = ftpServerPort;
            this.Connect();
        }
        #endregion

        #region 登陆字段、属性
        /// 
        /// FTP服务器IP地址
        /// 
        private string ftpServerIP;
        public string FtpServerIP
        {
            get
            {
                return ftpServerIP;
            }
            set
            {
                this.ftpServerIP = value;
            }
        }
        /// 
        /// FTP服务器端口
        /// 
        private int ftpServerPort;
        public int FtpServerPort
        {
            get
            {
                return ftpServerPort;
            }
            set
            {
                this.ftpServerPort = value;
            }
        }
        /// 
        /// 当前服务器目录
        /// 
        private string remoteFilePath;
        public string RemoteFilePath
        {
            get
            {
                return remoteFilePath;
            }
            set
            {
                this.remoteFilePath = value;
            }
        }
        /// 
        /// Ftp 服务器登录用户账号
        /// 
        private string ftpUserID;
        public string FtpUserID
        {
            set
            {
                this.ftpUserID = value;
            }
        }
        /// 
        /// Ftp 服务器用户登录密码
        /// 
        private string ftpPassword;
        public string FtpPassword
        {
            set
            {
                this.ftpPassword = value;
            }
        }

        /// 
        /// 是否登录
        /// 
        private bool bConnected;
        public bool Connected
        {
            get
            {
                return this.bConnected;
            }
        }
        #endregion

        #region 链接
        /// 
        /// 建立连接 
        /// 
        public void Connect()
        {
            socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ep = new IPEndPoint(IPAddress.Parse(FtpServerIP), ftpServerPort);
            // 链接
            try
            {
                socketControl.Connect(ep);
            }
            catch (Exception)
            {
                throw new IOException("Couldn't connect to remote server");
            }

            // 获取应答码
            ReadReply();
            if (iReplyCode != 220)
            {
                DisConnect();
                throw new IOException(strReply.Substring(4));
            }

            // 登陆
            SendCommand("USER " + ftpUserID);
            if (!(iReplyCode == 331 || iReplyCode == 230))
            {
                CloseSocketConnect();//关闭连接
                throw new IOException(strReply.Substring(4));
            }
            if (iReplyCode != 230)
            {
                SendCommand("PASS " + ftpPassword);
                if (!(iReplyCode == 230 || iReplyCode == 202))
                {
                    CloseSocketConnect();//关闭连接
                    throw new IOException(strReply.Substring(4));
                }
            }

            bConnected = true;

            // 切换到初始目录
            if (!string.IsNullOrEmpty(remoteFilePath))
            {
                ChDir(remoteFilePath);
            }
        }


        /// 
        /// 关闭连接
        /// 
        public void DisConnect()
        {
            if (socketControl != null)
            {
                SendCommand("QUIT");
            }
            CloseSocketConnect();
        }

        #endregion

        #region 传输模式

        /// 
        /// 传输模式:二进制类型、ASCII类型
        /// 
        public enum TransferType
        {
            Binary,
            ASCII
        };

        /// 
        /// 设置传输模式
        /// 
        /// 传输模式
        public void SetTransferType(TransferType ttType)
        {
            if (ttType == TransferType.Binary)
            {
                SendCommand("TYPE I");//binary类型传输
            }
            else
            {
                SendCommand("TYPE A");//ASCII类型传输
            }
            if (iReplyCode != 200)
            {
                throw new IOException(strReply.Substring(4));
            }
            else
            {
                trType = ttType;
            }
        }


        /// 
        /// 获得传输模式
        /// 
        /// 传输模式
        public TransferType GetTransferType()
        {
            return trType;
        }

        #endregion

        #region 文件操作
        /// 
        /// 获得文件列表
        /// 
        /// 文件名的匹配字符串
        /// 
        public string[] Dir(string strMask)
        {
            // 建立链接
            if (!bConnected)
            {
                Connect();
            }

            //建立进行数据连接的socket
            Socket socketData = CreateDataSocket();

            //传送命令
            SendCommand("LIST " + strMask);

            //分析应答代码
            if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226))
            {
                throw new IOException(strReply.Substring(4));
            }

            //获得结果
            strMsg = "";
            while (true)
            {
                int iBytes = socketData.Receive(buffer, buffer.Length, 0);
                strMsg += GB2312.GetString(buffer, 0, iBytes);
                if (iBytes < buffer.Length)
                {
                    break;
                }
            }
            char[] seperator = { '\n' };
            string[] strsFileList = strMsg.Split(seperator);
            socketData.Close();//数据socket关闭时也会有返回码
            if (iReplyCode != 226)
            {
                ReadReply();
                if (iReplyCode != 226)
                {
                    throw new IOException(strReply.Substring(4));
                }
            }
            return strsFileList;
        }


        /// 
        /// 获取文件大小
        /// 
        /// 文件名
        /// 文件大小
        public long GetFileSize(string strFileName)
        {
            if (!bConnected)
            {
                Connect();
            }
            SendCommand("SIZE " + Path.GetFileName(strFileName));
            long lSize = 0;
            if (iReplyCode == 213)
            {
                lSize = Int64.Parse(strReply.Substring(4));
            }
            else
            {
                throw new IOException(strReply.Substring(4));
            }
            return lSize;
        }


        /// 
        /// 删除
        /// 
        /// 待删除文件名
        public void Delete(string strFileName)
        {
            if (!bConnected)
            {
                Connect();
            }
            SendCommand("DELE " + strFileName);
            if (iReplyCode != 250)
            {
                throw new IOException(strReply.Substring(4));
            }
        }


        /// 
        /// 重命名(如果新文件名与已有文件重名,将覆盖已有文件)
        /// 
        /// 旧文件名
        /// 新文件名
        public void Rename(string strOldFileName, string strNewFileName)
        {
            if (!bConnected)
            {
                Connect();
            }
            SendCommand("RNFR " + strOldFileName);
            if (iReplyCode != 350)
            {
                throw new IOException(strReply.Substring(4));
            }
            //  如果新文件名与原有文件重名,将覆盖原有文件
            SendCommand("RNTO " + strNewFileName);
            if (iReplyCode != 250)
            {
                throw new IOException(strReply.Substring(4));
            }
        }
        #endregion

        #region 上传和下载
        /// 
        /// 下载一批文件
        /// 
        /// 文件名的匹配字符串
        /// 本地目录(不得以\结束)
        public void Download(string strFileNameMask, string strFolder)
        {
            if (!bConnected)
            {
                Connect();
            }
            string[] strFiles = Dir(strFileNameMask);
            foreach (string strFile in strFiles)
            {
                if (!strFile.Equals(""))//一般来说strFiles的最后一个元素可能是空字符串
                {
                    if (strFile.LastIndexOf(".") > -1)
                    {
                        Download(strFile.Replace("\r", ""), strFolder, strFile.Replace("\r", ""));
                    }
                }
            }
        }

        /// 
        /// 下载目录
        /// 
        /// 要下载的文件名
        /// 本地目录(不得以\结束)
        /// 保存在本地时的文件名
        public void Download(string strRemoteFileName, string strFolder, string strLocalFileName)
        {
            if (strLocalFileName.StartsWith("-r"))
            {
                string[] infos = strLocalFileName.Split(' ');
                strRemoteFileName = strLocalFileName = infos[infos.Length - 1];
                if (!this.bConnected)
                {
                    this.Connect();
                }
                SetTransferType(TransferType.Binary);
                if (strLocalFileName.Equals(""))
                {
                    strLocalFileName = strRemoteFileName;
                }
                if (!File.Exists(strLocalFileName))
                {
                    Stream st = File.Create(strLocalFileName);
                    st.Close();
                }
                FileStream output = new
                    FileStream(strFolder + "\\" + strLocalFileName, FileMode.Create);
                Socket socketData = CreateDataSocket();
                SendCommand("RETR " + strRemoteFileName);
                if (!(iReplyCode == 150 || iReplyCode == 125
                || iReplyCode == 226 || iReplyCode == 250))
                {
                    throw new IOException(strReply.Substring(4));
                }
                int receiveBytes = 0;
                while (true)
                {
                    int iBytes = socketData.Receive(buffer, buffer.Length, 0);
                    receiveBytes = receiveBytes + iBytes;
                    output.Write(buffer, 0, iBytes);
                    if (iBytes             
关注
打赏
1647422595
查看更多评论
0.0789s