62,041
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.IO;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace FTP
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
public class FtpClient
{
#region 内部变量
/// <summary>
/// 服务器返回的应答信息(包含应答码)
/// </summary>
private string Msg;
/// <summary>
/// 服务器返回的应答信息(包含应答码)
/// </summary>
private string Reply;
/// <summary>
/// 服务器返回的应答码
/// </summary>
private int iReplyCode;
/// <summary>
/// 进行控制连接的socket
/// </summary>
private Socket socketControl;
/// <summary>
/// 传输模式
/// </summary>
private TransferType trType;
/// <summary>
/// 接收和发送数据的缓冲区
/// </summary>
private static int BLOCK_SIZE = 512;
Byte[] buffer = new Byte[BLOCK_SIZE];
#endregion
#region 构造函数
/// <summary>
/// 缺省构造函数
/// </summary>
public FtpClient()
{
remoteHost = "";
remotePath = "";
remoteUser = "";
remotePass = "";
remotePort = 21;
bConnected = false; //没有链接
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="remoteHost"></param>
/// <param name="remotePath"></param>
/// <param name="remoteUser"></param>
/// <param name="remotePass"></param>
/// <param name="remotePort"></param>
public FtpClient( string remotehost, string remotepath, string remoteuser, string remotepass, int remoteport )
{
remoteHost = remotehost;
remotePath = remotepath;
remoteUser = remoteuser;
remotePass = remotepass;
remotePort = remoteport;
Connect(); //建立链接
}
#endregion
#region 登陆
/// <summary>
/// FTP服务器IP地址
/// </summary>
private string remoteHost; //FTP服务器IP地址
public string RemoteHost //FTP服务器IP地址
{
get
{
return remoteHost;
}
set
{
remoteHost = value;
}
}
/// <summary>
/// FTP服务器端口
/// </summary>
private int remotePort;
public int RemotePort
{
get
{
return remotePort;
}
set
{
remotePort = value;
}
}
/// <summary>
/// FTP服务器端口
/// </summary>
private string remotePath;
public string RemotePath
{
get
{
return remotePath;
}
set
{
remotePath = value;
}
}
/// <summary>
/// 登录用户账号
/// </summary>
private string remoteUser;
public string RemoteUser
{
set
{
remoteUser = value;
}
}
/// <summary>
/// 用户登录密码
/// </summary>
private string remotePass;
public string RemotePass
{
set
{
remotePass = value;
}
}
/// <summary>
/// 是否已登录
/// </summary>
private bool bConnected;
public bool Connected
{
get
{
return bConnected;
}
}
#endregion
#region 链接
/// <summary>
/// 建立连接
/// </summary>
public void Connect()
{
socketControl = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPEndPoint ep = new IPEndPoint(IPAddress.Parse(remoteHost), remotePort);
// 链接
try
{
socketControl.Connect(ep);
}
catch(Exception)
{
throw new IOException("不能链接到指定的服务器!");
}
// 获取应答码
ReadReply();
if(iReplyCode != 220)
{
DisConnect();
throw new IOException(Reply.Substring(4));
}
// 登陆
SendCommand("USER "+remoteUser);
if( !(iReplyCode == 331 || iReplyCode == 230) )
{
CloseSocketConnect();//关闭连接
throw new IOException(Reply.Substring(4));
}
if( iReplyCode != 230 )
{
SendCommand("PASS "+remotePass);
if( !(iReplyCode == 230 || iReplyCode == 202) )
{
CloseSocketConnect();//关闭连接
throw new IOException(Reply.Substring(4));
}
}
bConnected = true;
// 切换到目录
ChDir(remotePath);
}
/// <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(Reply.Substring(4));
}
else
{
trType = ttType;
}
}
/// <summary>
/// 获得传输模式
/// </summary>
/// <returns>传输模式</returns>
public TransferType GetTransferType()
{
return trType;
}
#endregion
#region 文件操作
/// <summary>
/// 获得文件列表
/// </summary>
/// <param name="strMask">文件名的匹配字符串</param>
/// <returns></returns>
public string[] Dir(string strMask)
{
// 建立链接
if(!bConnected)
{
Connect();
}
//建立进行数据连接的socket
Socket socketData = CreateDataSocket();
//传送命令
SendCommand("NLST " + strMask);
//分析应答代码
if(!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226))
{
throw new IOException(Reply.Substring(4));
}
//获得结果
Msg = "";
while(true)
{
int iBytes = socketData.Receive(buffer, buffer.Length, 0);
Msg += Encoding.ASCII.GetString(buffer, 0, iBytes);
if(iBytes < buffer.Length)
{
break;
}
}
char[] seperator = {'\n'};
string[] strsFileList = Msg.Split(seperator);
socketData.Close();//数据socket关闭时也会有返回码
if(iReplyCode != 226)
{
ReadReply();
if(iReplyCode != 226)
{
throw new IOException(Reply.Substring(4));
}
}
return strsFileList;
}