06
2015
07

【C#、Asp.Net-工具类大全】FTP文件操作工具类

前端页面代码:

<input id="fileUpload" type="file" runat="server" visible="false" />
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="sBtn1" runat="server" OnClick="sBtn1_Click" Text="FTP上传" />
<asp:Button ID="sBtn2" runat="server" OnClick="sBtn2_Click" Text="FTP下载" />
<asp:Button ID="sBtn3" runat="server" OnClick="sBtn3_Click" Text="FTP删除" />
<asp:Button ID="sBtn4" runat="server" OnClick="sBtn4_Click" Text="FTP文件读取" />
<asp:Button ID="sBtn5" runat="server" OnClick="sBtn5_Click" Text="FTP操作" />

使用C#实例:

/// <summary>
/// FTP上传
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void sBtn1_Click(object sender, EventArgs e)
{
    urlPath = Server.MapPath("~/file/");
    //FTPHelper.Upload(FileUpload1, "192.168.0.190", "zhengdecai", "zhengdecai"); //需要现在做上传本地,然后在上传FTP
    //FTPHelper.UploadSmall(urlPath + "ad2.gif", "public", "192.168.0.190", "zhengdecai", "zhengdecai");
    //FTPHelper.UploadFtp(FileUpload1.PostedFile, FileUpload1.PostedFile.FileName, "public", "192.168.0.190", "zhengdecai", "zhengdecai");
    //FTPHelper.CreateDirectory(urlPath, "192.168.0.190", "zhengdecai", "zhengdecai");
}
/// <summary>
/// FTP下载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void sBtn2_Click(object sender, EventArgs e)
{
    urlPath = Server.MapPath("~/file/");
    string uri = "ftp://192.168.0.190/";
    //FTPHelper.Download("zhengdecai", "zhengdecai", uri, urlPath, "ad1.gif");
    //FTPHelper.Download(urlPath, "ad1.gif", "ad2.gif", "192.168.0.190", "zhengdecai", "zhengdecai");
}
/// <summary>
/// FTP删除
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void sBtn3_Click(object sender, EventArgs e)
{ 
    //FTPHelper.DeleteFile(uri, "zhengdecai", "zhengdecai", "ad1.gif");
    //FTPHelper.DeleteFtpFile(new string[2] { "ad1.gif", "ad2.gif" }, "public", "192.168.0.190", "zhengdecai", "zhengdecai"); //多张图片使用数组
}
/// <summary>
/// FTP获取
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void sBtn4_Click(object sender, EventArgs e)
{
    //string[] LStr = FTPHelper.GetFileList("public", "192.168.0.190", "zhengdecai", "zhengdecai");
    //FTPHelper.CheckFileOrPath("public", "192.168.0.190", "zhengdecai", "zhengdecai");
}
/// <summary>
/// FTP完全操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void sBtn5_Click(object sender, EventArgs e)
{
    urlPath = Server.MapPath("~/file/");
    FTPHelper ftpHelper = new FTPHelper("192.168.0.190", "", "zhengdecai", "zhengdecai", 21);
    ftpHelper.Connect(); //建立连接
    /*string[] fileP = ftpHelper.Dir("");
    ftpHelper.newPutByGuid(urlPath + "5.gif", "ad1.gif");
    ftpHelper.GetFileSize("1.jpg");
    ftpHelper.GetFileInfo("1.jpg");
    ftpHelper.Delete("2.jpg");
    ftpHelper.Rename("1.jpg", "4.jpg");*/
    //ftpHelper.Get("*", urlPath);
    //ftpHelper.GetNoBinary("ad1.gif", urlPath, "ad5.gif");
    //ftpHelper.Put(urlPath, "*"); //上传到根目录下面
    ftpHelper.MkDir("zhdc");
    ftpHelper.RmDir("zhdc");
    ftpHelper.ChDir("public/");
            
    ftpHelper.DisConnect(); //关闭连接 
}

类库信息:

/// <summary>
/// FTP文件操作类
/// </summary>
public class FTPHelper
{
    #region FTP上的各种操作,传需要操作的FTP服务器信息
    /// <summary>
    /// FTP上传文件
    /// </summary>
    /// <param name="fileUpload">上传控件</param>
    /// <param name="ftpServerIP">上传文件服务器IP</param>
    /// <param name="ftpUserID">服务器用户名</param>
    /// <param name="ftpPassword">服务器密码</param>
    /// <returns></returns>
    public static string Upload(FileUpload fileUpload, string ftpServerIP, string ftpUserID, string ftpPassword)
    {
        string filename = fileUpload.FileName;
        string sRet = "上传成功!";
        FileInfo fileInf = new FileInfo(fileUpload.PostedFile.FileName);
        string uri = "ftp://" + ftpServerIP + "/" + filename;
        FtpWebRequest reqFTP;
        // 根据uri创建FtpWebRequest对象 
        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
        // ftp用户名和密码
        reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
        // 默认为true,连接不会被关闭
        // 在一个命令之后被执行
        reqFTP.KeepAlive = false;
        // 指定执行什么命令
        reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
        // 指定数据传输类型
        reqFTP.UseBinary = true;
        reqFTP.UsePassive = false;
        // 上传文件时通知服务器文件的大小
        reqFTP.ContentLength = fileInf.Length;
        // 缓冲大小设置为2kb
        int buffLength = 2048;
        byte[] buff = new byte[buffLength];
        int contentLen;
        // 打开一个文件流 (System.IO.FileStream) 去读上传的文件
        FileStream fs = fileInf.OpenRead();
        try
        {
            // 把上传的文件写入流
            Stream strm = reqFTP.GetRequestStream();
            // 每次读文件流的2kb
            contentLen = fs.Read(buff, 0, buffLength);
            // 流内容没有结束
            while (contentLen != 0)
            {
                // 把内容从file stream 写入 upload stream
                strm.Write(buff, 0, contentLen);
                contentLen = fs.Read(buff, 0, buffLength);
            }
            // 关闭两个流
            strm.Close();
            fs.Close();
        }
        catch (Exception ex)
        {
            sRet = ex.Message;
        }
        return sRet;
    }
    /// <summary>
    /// FTP下载文件
    /// </summary>
    /// <param name="userId">FTP用户名</param>
    /// <param name="pwd">FTP密码</param>
    /// <param name="ftpPath">FTP文件路径</param>
    /// <param name="filePath">下载保存路径</param>
    /// <param name="fileName">FTP文件名</param>
    /// <returns></returns>
    public static string Download(string userId, string pwd, string ftpPath, string filePath, string fileName)
    {
        string sRet = "下载成功!";
        FtpWebRequest reqFTP;
        try
        {
            FileStream outputStream = new FileStream(filePath + fileName, FileMode.Create);
            // 根据uri创建FtpWebRequest对象   
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpPath + fileName));
            // 指定执行什么命令  
            reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
            // 指定数据传输类型  
            reqFTP.UseBinary = true;
            reqFTP.UsePassive = false;
            // FTP用户名和密码  
            reqFTP.Credentials = new NetworkCredential(userId, pwd);
            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
            // 把下载的文件写入流
            Stream ftpStream = response.GetResponseStream();
            long cl = response.ContentLength;
            // 缓冲大小设置为2kb  
            int bufferSize = 2048;
            int readCount;
            byte[] buffer = new byte[bufferSize];
            // 每次读文件流的2kb  
            readCount = ftpStream.Read(buffer, 0, bufferSize);
            while (readCount > 0)
            {
                // 把内容从文件流写入   
                outputStream.Write(buffer, 0, readCount);
                readCount = ftpStream.Read(buffer, 0, bufferSize);
            }
            //关闭两个流和FTP连接
            ftpStream.Close();
            outputStream.Close();
            response.Close();
        }
        catch (Exception ex)
        {
            sRet = ex.Message;
        }
        //返回下载结果(是否下载成功)
        return sRet;
    }
    /// <summary>
    /// FTP删除文件
    /// </summary>
    /// <param name="ftpPath">FTP文件路径</param>
    /// <param name="userId">FTP用户名</param>
    /// <param name="pwd">FTP密码</param>
    /// <param name="fileName">FTP文件名</param>
    /// <returns></returns>
    public static string DeleteFile(string ftpPath, string userId, string pwd, string fileName)
    {
        string sRet = "删除成功!";
        FtpWebResponse Respose = null;
        FtpWebRequest reqFTP = null;
        Stream localfile = null;
        Stream stream = null;
        try
        {
            //根据uri创建FtpWebRequest对象  
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(string.Format(@"{0}{1}", ftpPath, fileName)));
            //提供账号密码的验证  
            reqFTP.Credentials = new NetworkCredential(userId, pwd);
            //默认为true是上传完后不会关闭FTP连接  
            reqFTP.KeepAlive = false;
            //执行删除操作
            reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;
            Respose = (FtpWebResponse)reqFTP.GetResponse();
        }
        catch (Exception ex)
        {
            sRet = ex.Message;
        }
        finally
        {
            //关闭连接跟流
            if (Respose != null)
                Respose.Close();
            if (localfile != null)
                localfile.Close();
            if (stream != null)
                stream.Close();
        }
        //返回执行状态
        return sRet;
    }
    /// <summary>
    /// 从FTP上下载文件,下载后文件重命名
    /// </summary>
    /// <param name="filePath">需要保存的文件路径</param>
    /// <param name="ImageSrc">保存文件名</param>
    /// <param name="ImageName">保存文件名称</param>
    /// <param name="ftpServerIP">FTP的IP地址</param>
    /// <param name="ftpUserName">FTP登录名</param>
    /// <param name="ftpPwd">FTP登录用户名</param>
    public static void Download(string filePath, string ImageSrc, string ImageName, string ftpServerIP, string ftpUserName, string ftpPwd)
    {
        if (!Directory.Exists(filePath))
        {
            Directory.CreateDirectory(filePath);
        }
        using (FileStream OutputStream = new FileStream(filePath + "\\" + ImageName, FileMode.Create))
        {
            FtpWebRequest ReqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + ImageSrc));
            ReqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
            ReqFTP.UseBinary = true;
            ReqFTP.Credentials = new NetworkCredential(ftpUserName, ftpPwd);
            using (FtpWebResponse response = (FtpWebResponse)ReqFTP.GetResponse())
            {
                using (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();
                }
                response.Close();
            }
            OutputStream.Close();
        }
    }
    /// <summary>
    /// 从服务器上传文件到FTP上
    /// </summary>
    /// <param name="sFileDstPath">需上传文件路径</param>
    /// <param name="FolderName">FTP上的文夹路径名</param>
    /// <param name="ftpServerIP">FTP的IP地址</param>
    /// <param name="ftpUserName">FTP登录名</param>
    /// <param name="ftpPwd">FTP登录用户名</param>
    public static void UploadSmall(string sFileDstPath, string FolderName, string ftpServerIP, string ftpUserName, string ftpPwd)
    {
        FileInfo fileInf = new FileInfo(sFileDstPath);
        FtpWebRequest reqFTP;
        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + (FolderName != "" ? (FolderName + "/") : "") + fileInf.Name));
        reqFTP.Credentials = new NetworkCredential(ftpUserName, ftpPwd);
        reqFTP.KeepAlive = false;
        reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
        reqFTP.UseBinary = true;
        reqFTP.ContentLength = fileInf.Length;
        int buffLength = 2048;
        byte[] buff = new byte[buffLength];
        int contentLen;
        using (FileStream fs = fileInf.OpenRead())
        {
            using (Stream strm = reqFTP.GetRequestStream())
            {
                contentLen = fs.Read(buff, 0, buffLength);
                while (contentLen != 0)
                {
                    strm.Write(buff, 0, contentLen);
                    contentLen = fs.Read(buff, 0, buffLength);
                }
                strm.Close();
            }
            fs.Close();
        }
    }
    /// <summary>
    /// 删除服务器上的文件
    /// </summary>
    /// <param name="sFilePath">上传文件路径</param>
    public static void DeleteWebServerFile(string sFilePath)
    {
        if (File.Exists(sFilePath))
        {
            File.Delete(sFilePath);
        }
    }
    /// <summary>
    /// 删除FTP上的文件
    /// </summary>
    /// <param name="IName">需删除的批量文件夹名</param>
    /// <param name="FolderName">FTP上的文夹路径名</param>
    /// <param name="ftpServerIP">FTP的IP地址</param>
    /// <param name="ftpUserName">FTP登录名</param>
    /// <param name="ftpPwd">FTP登录用户名</param>
    public static void DeleteFtpFile(string[] IName, string FolderName, string ftpServerIP, string ftpUserName, string ftpPwd)
    {
        foreach (string ImageName in IName)
        {
            string[] FileList = GetFileList(FolderName, ftpServerIP, ftpUserName, ftpPwd);
            for (int i = 0; i < FileList.Length; i++)
            {
                string Name = FileList[i].ToString();
                if (Name == ImageName)
                {
                    FtpWebRequest ReqFTP;
                    ReqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + FolderName + "/" + ImageName));
                    ReqFTP.Credentials = new NetworkCredential(ftpUserName, ftpPwd);
                    ReqFTP.KeepAlive = false;
                    ReqFTP.Method = WebRequestMethods.Ftp.DeleteFile;
                    ReqFTP.UseBinary = true;
                    using (FtpWebResponse Response = (FtpWebResponse)ReqFTP.GetResponse())
                    {
                        long size = Response.ContentLength;
                        using (Stream datastream = Response.GetResponseStream())
                        {
                            using (StreamReader sr = new StreamReader(datastream))
                            {
                                sr.ReadToEnd();
                                sr.Close();
                            }
                            datastream.Close();
                        }
                        Response.Close();
                    }
                }
            }
        }
    }
    /// <summary>
    /// 检查FTP上文件是否存在
    /// </summary>
    /// <param name="FolderName">FTP上的文夹路径名</param>
    /// <param name="ftpServerIP">FTP的IP地址</param>
    /// <param name="ftpUserName">FTP登录名</param>
    /// <param name="ftpPwd">FTP登录用户名</param>
    /// <returns></returns>
    public static string[] GetFileList(string FolderName, string ftpServerIP, string ftpUserName, string ftpPwd)
    {
        string[] downloadFiles;
        StringBuilder result = new StringBuilder();
        FtpWebRequest reqFTP;
        try
        {
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + (FolderName != "" ? (FolderName + "/") : "")));
            reqFTP.UseBinary = true;
            reqFTP.Credentials = new NetworkCredential(ftpUserName, ftpPwd);
            reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
            WebResponse response = reqFTP.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream());
            string line = reader.ReadLine();
            while (line != null)
            {
                result.Append(line);
                result.Append("\n");
                line = reader.ReadLine();
            }
            // to remove the trailing '\n'        
            result.Remove(result.ToString().LastIndexOf('\n'), 1);
            reader.Close();
            response.Close();
            return result.ToString().Split('\n');
        }
        catch (Exception ex)
        {
            downloadFiles = null;
            return downloadFiles;
        }
    }
    /// <summary>
    /// 从客户端上传文件到FTP上
    /// </summary>
    /// <param name="sFilePath">需要保存到本地的文件路径</param>
    /// <param name="filename">需要保存到本地的文件名</param>
    /// <param name="FolderName">FTP上的文夹路径名</param>
    /// <param name="ftpServerIP">FTP的IP地址</param>
    /// <param name="ftpUserName">FTP登录名</param>
    /// <param name="ftpPwd">FTP登录用户名</param>
    public static void UploadFtp(HttpPostedFile sFilePath, string filename, string FolderName, string ftpServerIP, string ftpUserName, string ftpPwd)
    {
        //获取的服务器路径
        //FileInfo fileInf = new FileInfo(sFilePath);
        FtpWebRequest reqFTP;
        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + (FolderName != "" ? (FolderName + "/") : "") + filename));
        reqFTP.Credentials = new NetworkCredential(ftpUserName, ftpPwd);
        reqFTP.KeepAlive = false;
        reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
        reqFTP.UseBinary = true;
        reqFTP.ContentLength = sFilePath.ContentLength;
        //设置缓存
        int buffLength = 2048;
        byte[] buff = new byte[buffLength];
        int contentLen;
        using (Stream fs = sFilePath.InputStream)
        {
            using (Stream strm = reqFTP.GetRequestStream())
            {
                contentLen = fs.Read(buff, 0, buffLength);
                while (contentLen != 0)
                {
                    strm.Write(buff, 0, contentLen);
                    contentLen = fs.Read(buff, 0, buffLength);
                }
                strm.Close();
            }
            fs.Close();
        }
    }
    /// <summary>
    /// FTP上创建目录
    /// </summary>
    /// <param name="FolderName">FTP上的文夹路径名</param>
    /// <param name="ftpServerIP">FTP的IP地址</param>
    /// <param name="ftpUserName">FTP登录名</param>
    /// <param name="ftpPwd">FTP登录用户名</param>
    public static void CreateDirectory(string FolderName, string ftpServerIP, string ftpUserName, string ftpPwd)
    {
        //创建日期目录
        try
        {
            FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + FolderName));
            reqFTP.UseBinary = true;
            reqFTP.Credentials = new NetworkCredential(ftpUserName, ftpPwd);
            reqFTP.KeepAlive = false;
            reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
        }
        catch
        {
                
        }
    }
    public static Regex regexName = new Regex(@"[^\s]*$", RegexOptions.Compiled);
    /// <summary>
    /// 检查日期目录和文件是否存在
    /// </summary>
    /// <param name="FolderName">FTP上的文夹路径名</param>
    /// <param name="ftpServerIP">FTP的IP地址</param>
    /// <param name="ftpUserName">FTP登录名</param>
    /// <param name="ftpPwd">FTP登录用户名</param>
    /// <returns></returns>
    public static bool CheckFileOrPath(string FolderName, string ftpServerIP, string ftpUserName, string ftpPwd)
    {
        //检查一下日期目录是否存在
        FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/"));
        reqFTP.UseBinary = true;
        reqFTP.Credentials = new NetworkCredential(ftpUserName, ftpPwd);
        reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
        Stream stream = reqFTP.GetResponse().GetResponseStream();
        using (StreamReader sr = new StreamReader(stream))
        {
            string line = sr.ReadLine();
            while (!string.IsNullOrEmpty(line))
            {
                GroupCollection gc = regexName.Match(line).Groups;
                if (gc.Count != 1)
                {
                    throw new ApplicationException("FTP 返回的字串格式不正确");
                }
                string path = gc[0].Value;
                if (path == FolderName)
                {
                    return true;
                }
                line = sr.ReadLine();
            }
        }
        return false;
    }
    #endregion
        
    #region FTP操作管理,需要实例化的时候把FTP服务器连接信息
    public static object obj = new object();
    #region 构造函数
    /// <summary>
    /// 缺省构造函数
    /// </summary>
    public FTPHelper()
    {
        strRemoteHost = "";
        strRemotePath = "";
        strRemoteUser = "";
        strRemotePass = "";
        strRemotePort = 21;
        bConnected = false;
    }
    /// <summary>
    /// 构造函数
    /// </summary>
    public FTPHelper(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>
    public 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;
    }
    /// <summary>
    /// 本地文件读取(没用过)
    /// </summary>
    /// <param name="strFileName"></param>
    /// <param name="strGuid"></param>
    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));
        }
        //  如果新文件名与原有文件重名,将覆盖原有文件
        SendCommand("RNTO " + strNewFileName);
        if (iReplyCode != 250)
        {
            throw new IOException(strReply.Substring(4));
        }
    }
    #endregion
    #region 上传和下载
    /// <summary>
    /// 下载一批文件
    /// </summary>
    /// <param name="strFileNameMask">文件夹名称</param>
    /// <param name="strFolder">本地目录(不得以\结束)</param>
    public void Get(string strFileNameMask, string strFolder)
    {
        if (!bConnected)
        {
            Connect();
        }
        string[] strFiles = Dir(strFileNameMask);
        foreach (string strFile in strFiles)
        {
            if (!bConnected)
            {
                Connect();
            }
            if (!strFile.Equals(""))//一般来说strFiles的最后一个元素可能是空字符串
            {
                Get(strFileNameMask,strFile.Replace("\r", ""), strFolder, strFile.Replace("\r", ""));
            }
        }
    }
    /// <summary>
    /// 下载一个文件
    /// </summary>
    /// <param name="strFileNameMask">文件夹:下载一个文件的时候,不需要传值</param>
    /// <param name="strRemoteFileName">要下载的文件名</param>
    /// <param name="strFolder">本地目录(不得以\结束)</param>
    /// <param name="strLocalFileName">保存在本地时的文件名</param>
    public void Get(string strFileNameMask, string strRemoteFileName, string strFolder, string strLocalFileName)
    {
        Socket socketData = CreateDataSocket();
        try
        {
            if (!bConnected)
            {
                Connect();
            }
            SetTransferType(TransferType.Binary);
            if (strLocalFileName.Equals(""))
            {
                strLocalFileName = strRemoteFileName;
            }
            SendCommand("RETR " + (strFileNameMask != "" ? (strFileNameMask + "/") : "") + strRemoteFileName);
            if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226 || iReplyCode == 250))
            {
                if (iReplyCode == 550)
                {
                    Get(strFileNameMask + strRemoteFileName, strFolder + "\\" + strRemoteFileName);
                }
                else
                {
                    throw new IOException(strReply.Substring(4));
                }
            }
            FileHelper.CreateDir(strFolder);
            FileStream output = new FileStream(strFolder + "\\" + strLocalFileName, FileMode.Create);
            while (true)
            {
                int iBytes = socketData.Receive(buffer, buffer.Length, 0);
                output.Write(buffer, 0, iBytes);
                if (iBytes <= 0)
                {
                    break;
                }
            }
            output.Close();
            if (socketData.Connected)
            {
                socketData.Close();
            }
            if (!(iReplyCode == 226 || iReplyCode == 250))
            {
                ReadReply();
                if (!(iReplyCode == 226 || iReplyCode == 250))
                {
                    throw new IOException(strReply.Substring(4));
                }
            }
        }
        catch
        {
            socketData.Close();
            socketData = null;
            socketControl.Close();
            bConnected = false;
            socketControl = null;
        }
    }
    /// <summary>
    /// 下载一个文件
    /// </summary>
    /// <param name="strRemoteFileName">要下载的文件名</param>
    /// <param name="strFolder">本地目录(不得以\结束)</param>
    /// <param name="strLocalFileName">保存在本地时的文件名</param>
    public void GetNoBinary(string strRemoteFileName, string strFolder, string strLocalFileName)
    {
        if (!bConnected)
        {
            Connect();
        }
        if (strLocalFileName.Equals(""))
        {
            strLocalFileName = strRemoteFileName;
        }
        Socket socketData = CreateDataSocket();
        SendCommand("RETR " + strRemoteFileName);
        if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226 || iReplyCode == 250))
        {
            throw new IOException(strReply.Substring(4));
        }
        FileStream output = new FileStream(strFolder + "\\" + strLocalFileName, FileMode.Create);
        while (true)
        {
            int iBytes = socketData.Receive(buffer, buffer.Length, 0);
            output.Write(buffer, 0, iBytes);
            if (iBytes <= 0)
            {
                break;
            }
        }
        output.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="strFolder">本地目录(不得以\结束)</param>
    /// <param name="strFileNameMask">文件名匹配字符(可以包含*和?)</param>
    public void Put(string strFolder, string strFileNameMask)
    {
        string[] strFiles = Directory.GetFiles(strFolder, strFileNameMask);
        foreach (string strFile in strFiles)
        {
            Put(strFile);
        }
    }
    /// <summary>
    /// 上传一个文件
    /// </summary>
    /// <param name="strFileName">本地文件名</param>
    public void Put(string strFileName)
    {
        if (!bConnected)
        {
            Connect();
        }
        Socket socketData = CreateDataSocket();
        if (Path.GetExtension(strFileName) == "")
            SendCommand("STOR " + Path.GetFileNameWithoutExtension(strFileName));
        else
            SendCommand("STOR " + Path.GetFileName(strFileName));
        if (!(iReplyCode == 125 || iReplyCode == 150))
        {
            throw new IOException(strReply.Substring(4));
        }
        FileStream input = new FileStream(strFileName, FileMode.Open);
        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>
    public void PutByGuid(string strFileName, string strGuid)
    {
        if (!bConnected)
        {
            Connect();
        }
        string str = strFileName.Substring(0, strFileName.LastIndexOf("\\"));
        string strTypeName = strFileName.Substring(strFileName.LastIndexOf("."));
        strGuid = str + "\\" + strGuid;
        System.IO.File.Copy(strFileName, strGuid);
        System.IO.File.SetAttributes(strGuid, System.IO.FileAttributes.Normal);
        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, System.IO.FileAccess.Read, System.IO.FileShare.Read);
        int iBytes = 0;
        while ((iBytes = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            socketData.Send(buffer, iBytes, 0);
        }
        input.Close();
        File.Delete(strGuid);
        if (socketData.Connected)
        {
            socketData.Close();
        }
        if (!(iReplyCode == 226 || iReplyCode == 250))
        {
            ReadReply();
            if (!(iReplyCode == 226 || iReplyCode == 250))
            {
                throw new IOException(strReply.Substring(4));
            }
        }
    }
    #endregion
    #region 目录操作
    /// <summary>
    /// 创建目录
    /// </summary>
    /// <param name="strDirName">目录名</param>
    public void MkDir(string strDirName)
    {
        if (!bConnected)
        {
            Connect();
        }
        SendCommand("MKD " + strDirName);
        if (iReplyCode != 257)
        {
            throw new IOException(strReply.Substring(4));
        }
    }
    /// <summary>
    /// 删除目录
    /// </summary>
    /// <param name="strDirName">目录名</param>
    public void RmDir(string strDirName)
    {
        if (!bConnected)
        {
            Connect();
        }
        SendCommand("RMD " + strDirName);
        if (iReplyCode != 250)
        {
            throw new IOException(strReply.Substring(4));
        }
    }
    /// <summary>
    /// 改变目录
    /// </summary>
    /// <param name="strDirName">新的工作目录名</param>
    public void ChDir(string strDirName)
    {
        if (strDirName.Equals(".") || strDirName.Equals(""))
        {
            return;
        }
        if (!bConnected)
        {
            Connect();
        }
        SendCommand("CWD " + strDirName);
        if (iReplyCode != 250)
        {
            throw new IOException(strReply.Substring(4));
        }
        this.strRemotePath = strDirName;
    }
    #endregion
    #region 内部函数
    /// <summary>
    /// 将一行应答字符串记录在strReply和strMsg,应答码记录在iReplyCode
    /// </summary>
    private void ReadReply()
    {
        strMsg = "";
        strReply = ReadLine();
        iReplyCode = Int32.Parse(strReply.Substring(0, 3));
    }
    /// <summary>
    /// 建立进行数据连接的socket
    /// </summary>
    /// <returns>数据连接socket</returns>
    private Socket CreateDataSocket()
    {
        SendCommand("PASV");
        if (iReplyCode != 227)
        {
            throw new IOException(strReply.Substring(4));
        }
        int index1 = strReply.IndexOf('(');
        int index2 = strReply.IndexOf(')');
        string ipData = strReply.Substring(index1 + 1, index2 - index1 - 1);
        int[] parts = new int[6];
        int len = ipData.Length;
        int partCount = 0;
        string buf = "";
        for (int i = 0; i < len && partCount <= 6; i++)
        {
            char ch = Char.Parse(ipData.Substring(i, 1));
            if (Char.IsDigit(ch))
                buf += ch;
            else if (ch != ',')
            {
                throw new IOException("Malformed PASV strReply: " + strReply);
            }
            if (ch == ',' || i + 1 == len)
            {
                try
                {
                    parts[partCount++] = Int32.Parse(buf);
                    buf = "";
                }
                catch (Exception)
                {
                    throw new IOException("Malformed PASV strReply: " + strReply);
                }
            }
        }
        string ipAddress = parts[0] + "." + parts[1] + "." + parts[2] + "." + parts[3];
        int port = (parts[4] << 8) + parts[5];
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ipAddress), port);
        try
        {
            s.Connect(ep);
        }
        catch (Exception)
        {
            throw new IOException("无法连接ftp服务器");
        }
        return s;
    }
    /// <summary>
    /// 关闭socket连接(用于登录以前)
    /// </summary>
    private void CloseSocketConnect()
    {
        lock (obj)
        {
            if (socketControl != null)
            {
                socketControl.Close();
                socketControl = null;
            }
            bConnected = false;
        }
    }
    /// <summary>
    /// 读取Socket返回的所有字符串
    /// </summary>
    /// <returns>包含应答码的字符串行</returns>
    private string ReadLine()
    {
        lock (obj)
        {
            while (true)
            {
                int iBytes = socketControl.Receive(buffer, buffer.Length, 0);
                strMsg += ASCII.GetString(buffer, 0, iBytes);
                if (iBytes < buffer.Length)
                {
                    break;
                }
            }
        }
        char[] seperator = { '\n' };
        string[] mess = strMsg.Split(seperator);
        if (strMsg.Length > 2)
        {
            strMsg = mess[mess.Length - 2];
        }
        else
        {
            strMsg = mess[0];
        }
        if (!strMsg.Substring(3, 1).Equals(" ")) //返回字符串正确的是以应答码(如220开头,后面接一空格,再接问候字符串)
        {
            return ReadLine();
        }
        return strMsg;
    }
    /// <summary>
    /// 发送命令并获取应答码和最后一行应答字符串
    /// </summary>
    /// <param name="strCommand">命令</param>
    public void SendCommand(String strCommand)
    {
        lock (obj)
        {
            Byte[] cmdBytes = Encoding.ASCII.GetBytes((strCommand + "\r\n").ToCharArray());
            socketControl.Send(cmdBytes, cmdBytes.Length, 0);
            Thread.Sleep(500);
            ReadReply();
        }
    }
    #endregion
    #endregion
}

FTP搭建及操作后效果图:

上面工具类中有两种FTP操作方式,根据自己的开发需求选择不同的方式。

以上类库内容来源互联网,站长稍作整理

« 上一篇下一篇 »

评论列表:

1.微部落  2015/7/7 13:08:24 回复该留言
站长朋友您好,贵站已经被微部落博客大全收录,目前调整到分类:“编程开发”,请您关注。回访,来访IP贵站就会在微部落大全首页展示,为您提高流量哦。。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。