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