|
.NET下的FTP上传、下载文件操作类
[转自:http://blog.iyunv.com/veryhappy/archive/2006/01/16/581072.aspx]
基本原理就是先建立Socket连接,然后发请求命令和取回应答码。编码方式采用Encoding?ASCII?=?Encoding.Default;来支持中文文件名。
using?System;
using?System.Net;
using?System.Net.Sockets;
using?System.Text;
using?System.IO;?
namespace?PMTSS.Common
{
?/**////?
?///?FTP?操作类
?///?
?public?class?FTP
?{
??private?string?strRemoteHost;
??private?int?strRemotePort;
??private?string?strRemotePath;
??private?string?strRemoteUser;
??private?string?strRemotePass;
??private?Boolean?bConnected;
??内部变量#region?内部变量
??/**////?
??///?服务器返回的应答信息(包含应答码)
??///?
??private?string?strMsg;
??/**////?
??///?服务器返回的应答信息(包含应答码)
??///?
??private?string?strReply;
??/**////?
??///?服务器返回的应答码
??///?
??private?int?iReplyCode;
??/**////?
??///?进行控制连接的socket
??///?
??private?Socket?socketControl;
??/**////?
??///?传输模式
??///?
??private?TransferType?trType;
??/**////?
??///?传输模式:二进制类型、ASCII类型
??///?
??public?enum?TransferType
??{
???/**////?
???///?Binary
???///?
???Binary,
???/**////?
???///?ASCII
???///?
???ASCII
??};
??/**////?
??///?接收和发送数据的缓冲区
??///?
??private?static?int?BLOCK_SIZE?=?512;
??Byte[]?buffer?=?new?Byte[?BLOCK_SIZE];
??/**////?
??///?编码方式
??///?
??Encoding?ASCII?=?Encoding.Default;
??#endregion
??内部函数#region?内部函数
??构造函数#region?构造函数
??/**////?
??///?缺省构造函数
??///?
??public?FTP()
??{
???strRemoteHost??=?"";
???strRemotePath??=?"";
???strRemoteUser??=?"";
???strRemotePass??=?"";
???strRemotePort??=?21;
???bConnected?????=?false;
??}
??/**////?
??///?构造函数
??///?
??///?
??///?
??///?
??///?
??///?
??public?FTP(?string?remoteHost,?string?remotePath,?string?remoteUser,?string?remotePass,?int?remotePort?)
??{
???strRemoteHost??=?remoteHost;
???strRemotePath??=?remotePath;
???strRemoteUser??=?remoteUser;
???strRemotePass??=?remotePass;
???strRemotePort??=?remotePort;
???Connect();
??}
??public?FTP(?string?remoteHost,?string?remotePath,?string?remoteUser,?string?remotePass)
??{
???strRemoteHost??=?remoteHost;
???strRemotePath??=?remotePath;
???strRemoteUser??=?remoteUser;
???strRemotePass??=?remotePass;
???strRemotePort??=?21;
???Connect();
??}
??#endregion
??登陆#region?登陆
??/**////?
??///?FTP服务器IP地址
??///?
??
??public?string?RemoteHost
??{
???get
???{
????return?strRemoteHost;
???}
???set
???{
????strRemoteHost?=?value;
???}
??}
??/**////?
??///?FTP服务器端口
??///?
??public?int?RemotePort
??{
???get
???{
????return?strRemotePort;
???}
???set
???{
????strRemotePort?=?value;
???}
??}
??/**////?
??///?当前服务器目录
??///?
??public?string?RemotePath
??{
???get
???{
????return?strRemotePath;
???}
???set
???{
????strRemotePath?=?value;
???}
??}
??/**////?
??///?登录用户账号
??///?
??public?string?RemoteUser
??{
???set
???{
????strRemoteUser?=?value;
???}
??}
??/**////?
??///?用户登录密码
??///?
??public?string?RemotePass
??{
???set
???{
????strRemotePass?=?value;
???}
??}
??/**////?
??///?是否登录
??///?
??public?bool?Connected
??{
???get
???{
????return?bConnected;
???}
??}
??#endregion
??链接#region?链接
??/**////?
??///?建立连接?
??///?
??public?void?Connect()
??{
???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("Couldn't?connect?to?remote?server");
???}
???//?获取应答码
???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);
??}
??/**////?
??///?关闭连接
??///?
??public?void?DisConnect()
??{
???if(?socketControl?!=?null?)
???{
????SendCommand("QUIT");
???}
???CloseSocketConnect();
??}
??#endregion
??传输模式#region?传输模式
??/**////?
??///?设置传输模式
??///?
??///?传输模式
??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;
???}
??}
??/**////?
??///?获得传输模式
??///?
??///?传输模式
??public?TransferType?GetTransferType()
??{
???return?trType;
??}
??#endregion
??文件操作#region?文件操作
??/**////?
??///?获得文件列表
??///?
??///?文件名的匹配字符串
??///?
??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(strReply.Substring(4));
???}
???//获得结果
???strMsg?=?"";
???while(true)
???{
????int?iBytes?=?socketData.Receive(buffer,?buffer.Length,?0);
????strMsg?+=?ASCII.GetString(buffer,?0,?iBytes);
????if(iBytes? |
|
|