读书人

C# FTP LIST解决方法

发布时间: 2012-04-04 16:38:51 作者: rapoo

C# FTP LIST
最近用C#写了个FTP客户端
代码如下:

C# code
public void DIR()        {            Socket dataSocket = null;            if (dataSocket==null)                dataSocket = createDataSocket();            string message = "";            if (SendComm("LIST") > 0)            {                try                {                    while (true)                    {                        Array.Clear(buffer, 0, buffer.Length);                        int bytes = dataSocket.Receive(buffer, buffer.Length, 0);                        message += Encoding.Default.GetString(buffer, 0, bytes);                        if (bytes < this.buffer.Length)                        {                            break;                        }                    }                    FTPReturn.FtpCode = 1;                    FTPReturn.FtpMessage = "send command [DIR] ok!\r\n";                    StatusChange(FTPReturn);                    message = message.Replace("\0", "");                    FTPReturn.FtpCode = 1;                    FTPReturn.FtpMessage = message;                    StatusChange(FTPReturn);                    string getResult = readMess();                    FTPReturn.FtpCode = Int32.Parse(getResult.Substring(0, 3));                    FTPReturn.FtpMessage = getResult;                    StatusChange(FTPReturn);                }                catch (System.Exception ex)                {                    FTPReturn.FtpCode = -1;                    FTPReturn.FtpMessage = ex.Message.ToString();                    StatusChange(FTPReturn);                }            }            else            {                string getResult = readMess();                FTPReturn.FtpCode = Int32.Parse(getResult.Substring(0, 3));                FTPReturn.FtpMessage = "send command [DIR] lose!\r\n";                StatusChange(FTPReturn);            }            dataSocket.Close();        }        /// <summary>        /// 开启另一个Socket来接受数据        /// </summary>        /// <returns>socket</returns>        private Socket createDataSocket()        {            Socket socket = null;            int socketPort = 0;            string ipData = "";                SetSendMode(FtpSendMode.pasv);//设置被动传输                if (FTPReturn.FtpMessage.ToString().IndexOf("227 ") >= 0)                {                    int i1 = FTPReturn.FtpMessage.IndexOf('(');                    int i2 = FTPReturn.FtpMessage.IndexOf(')');                    ipData = FTPReturn.FtpMessage.Substring(i1 + 1, i2 - 1 - i1);                    string[] ipMess = new string[6];                    try                    {                        ipMess = ipData.Split(',');                        socketPort = (int.Parse(ipMess[4]) << 8) + int.Parse(ipMess[5]);                        FTPReturn.FtpCode = 1;                        FTPReturn.FtpMessage = "端口已经获得“" + socketPort + "”\r\n";                        StatusChange(FTPReturn);                    }                    catch (System.Exception ex)                    {                        FTPReturn.FtpCode = -1;                        FTPReturn.FtpMessage = ex.Message.ToString();                        StatusChange(FTPReturn);                    }                }                try                {                    socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                    socket.Connect(FTPAdd, socketPort);                }                catch (Exception ex)                {                    if (socket != null && socket.Connected) socket.Close();                    FTPReturn.FtpCode = -1;                    FTPReturn.FtpMessage = ex.Message.ToString();                    StatusChange(FTPReturn);                }            return socket;        }     


在两个按钮单击事件里面执行—IR())可以通过。
但在一个按钮单击事件中执行两次—IR())就会出现问题,第二次DIR()得不到端口号,第一次DIR()返回目录后得到(150 Opening ASCII mode data connection for /bin/ls.)好像是数据连接并没有关闭。第二次设置传输模式时只能得到(226 Transfer complete.)无法得到227的返回信息?
如何在执行一次DIR()后关闭data connection呢?

[解决办法]
if (socket != null && socket.Connected) socket.Close();
类似代码在执行前判断一下,保证每次新开一个连接
[解决办法]


Application for uploading modified Files to a FTP Server
http://www.codeproject.com/KB/IP/net_ftp_upload.aspx

FTP client library for C#
http://www.codeproject.com/KB/IP/ftplibrary.aspx

An FTP client library for .NET 2.0
http://www.codeproject.com/KB/IP/FtpClient.aspx

Simple FTP demo application using C#.Net 2.0
http://www.codeproject.com/KB/IP/SimpleFTPDemo.aspx

读书人网 >C#

热点推荐