⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftpclient.cs

📁 c#常用类库大全
💻 CS
📖 第 1 页 / 共 2 页
字号:
using System;
using System.Net;
using System.IO;
using System.Text;
using System.Net.Sockets;
using System.Threading;

public class FTPClient
{
    public static object obj = new object();

    #region 构造函数
    /// <summary>
    /// 缺省构造函数
    /// </summary>
    public FTPClient()
    {
        strRemoteHost = "";
        strRemotePath = "";
        strRemoteUser = "";
        strRemotePass = "";
        strRemotePort = 21;
        bConnected = false;
    }

    /// <summary>
    /// 构造函数
    /// </summary>
    public FTPClient(string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort)
    {
        strRemoteHost = remoteHost;
        strRemotePath = remotePath;
        strRemoteUser = remoteUser;
        strRemotePass = remotePass;
        strRemotePort = remotePort;
        Connect();
    }
    #endregion

    #region 字段
    private int strRemotePort;
    private Boolean bConnected;
    private string strRemoteHost;
    private string strRemotePass;
    private string strRemoteUser;
    private string strRemotePath;

    /// <summary>
    /// 服务器返回的应答信息(包含应答码)
    /// </summary>
    private string strMsg;
    /// <summary>
    /// 服务器返回的应答信息(包含应答码)
    /// </summary>
    private string strReply;
    /// <summary>
    /// 服务器返回的应答码
    /// </summary>
    private int iReplyCode;
    /// <summary>
    /// 进行控制连接的socket
    /// </summary>
    private Socket socketControl;
    /// <summary>
    /// 传输模式
    /// </summary>
    private TransferType trType;
    /// <summary>
    /// 接收和发送数据的缓冲区
    /// </summary>
    private static int BLOCK_SIZE = 512;
    /// <summary>
    /// 编码方式
    /// </summary>
    Encoding ASCII = Encoding.ASCII;
    /// <summary>
    /// 字节数组
    /// </summary>
    Byte[] buffer = new Byte[BLOCK_SIZE];
    #endregion

    #region 属性
    /// <summary>
    /// FTP服务器IP地址
    /// </summary>
    public string RemoteHost
    {
        get
        {
            return strRemoteHost;
        }
        set
        {
            strRemoteHost = value;
        }
    }

    /// <summary>
    /// FTP服务器端口
    /// </summary>
    public int RemotePort
    {
        get
        {
            return strRemotePort;
        }
        set
        {
            strRemotePort = value;
        }
    }

    /// <summary>
    /// 当前服务器目录
    /// </summary>
    public string RemotePath
    {
        get
        {
            return strRemotePath;
        }
        set
        {
            strRemotePath = value;
        }
    }

    /// <summary>
    /// 登录用户账号
    /// </summary>
    public string RemoteUser
    {
        set
        {
            strRemoteUser = value;
        }
    }

    /// <summary>
    /// 用户登录密码
    /// </summary>
    public string RemotePass
    {
        set
        {
            strRemotePass = value;
        }
    }

    /// <summary>
    /// 是否登录
    /// </summary>
    public bool Connected
    {
        get
        {
            return bConnected;
        }
    }
    #endregion

    #region 链接
    /// <summary>
    /// 建立连接 
    /// </summary>
    public void Connect()
    {
        lock (obj)
        {
            socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ep = new IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort);
            try
            {
                socketControl.Connect(ep);
            }
            catch (Exception)
            {
                throw new IOException("不能连接ftp服务器");
            }
        }
        ReadReply();
        if (iReplyCode != 220)
        {
            DisConnect();
            throw new IOException(strReply.Substring(4));
        }
        SendCommand("USER " + strRemoteUser);
        if (!(iReplyCode == 331 || iReplyCode == 230))
        {
            CloseSocketConnect();
            throw new IOException(strReply.Substring(4));
        }
        if (iReplyCode != 230)
        {
            SendCommand("PASS " + strRemotePass);
            if (!(iReplyCode == 230 || iReplyCode == 202))
            {
                CloseSocketConnect();
                throw new IOException(strReply.Substring(4));
            }
        }
        bConnected = true;
        ChDir(strRemotePath);
    }

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

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

    /// <summary>
    /// 设置传输模式
    /// </summary>
    /// <param name="ttType">传输模式</param>
    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;
        }
    }

    /// <summary>
    /// 获得传输模式
    /// </summary>
    /// <returns>传输模式</returns>
    public TransferType GetTransferType()
    {
        return trType;
    }
    #endregion

    #region 文件操作
    /// <summary>
    /// 获得文件列表
    /// </summary>
    /// <param name="strMask">文件名的匹配字符串</param>
    public string[] Dir(string strMask)
    {
        if (!bConnected)
        {
            Connect();
        }
        Socket socketData = CreateDataSocket();
        SendCommand("NLST " + strMask);
        if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226))
        {
            throw new IOException(strReply.Substring(4));
        }
        strMsg = "";
        Thread.Sleep(2000);
        while (true)
        {
            int iBytes = socketData.Receive(buffer, buffer.Length, 0);
            strMsg += ASCII.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 void newPutByGuid(string strFileName, string strGuid)
    {
        if (!bConnected)
        {
            Connect();
        }
        string str = strFileName.Substring(0, strFileName.LastIndexOf("\\"));
        string strTypeName = strFileName.Substring(strFileName.LastIndexOf("."));
        strGuid = str + "\\" + strGuid;
        Socket socketData = CreateDataSocket();
        SendCommand("STOR " + Path.GetFileName(strGuid));
        if (!(iReplyCode == 125 || iReplyCode == 150))
        {
            throw new IOException(strReply.Substring(4));
        }
        FileStream input = new FileStream(strGuid, FileMode.Open);
        input.Flush();
        int iBytes = 0;
        while ((iBytes = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            socketData.Send(buffer, iBytes, 0);
        }
        input.Close();
        if (socketData.Connected)
        {
            socketData.Close();
        }
        if (!(iReplyCode == 226 || iReplyCode == 250))
        {
            ReadReply();
            if (!(iReplyCode == 226 || iReplyCode == 250))
            {
                throw new IOException(strReply.Substring(4));
            }
        }
    }

    /// <summary>
    /// 获取文件大小
    /// </summary>
    /// <param name="strFileName">文件名</param>
    /// <returns>文件大小</returns>
    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;
    }


    /// <summary>
    /// 获取文件信息
    /// </summary>
    /// <param name="strFileName">文件名</param>
    /// <returns>文件大小</returns>
    public string GetFileInfo(string strFileName)
    {
        if (!bConnected)
        {
            Connect();
        }
        Socket socketData = CreateDataSocket();
        SendCommand("LIST " + strFileName);
        string strResult = "";
        if (!(iReplyCode == 150 || iReplyCode == 125
            || iReplyCode == 226 || iReplyCode == 250))
        {
            throw new IOException(strReply.Substring(4));
        }
        byte[] b = new byte[512];
        MemoryStream ms = new MemoryStream();

        while (true)
        {
            int iBytes = socketData.Receive(b, b.Length, 0);
            ms.Write(b, 0, iBytes);
            if (iBytes <= 0)
            {

                break;
            }
        }
        byte[] bt = ms.GetBuffer();
        strResult = System.Text.Encoding.ASCII.GetString(bt);
        ms.Close();
        return strResult;
    }

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

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -