设为首页 收藏本站
查看: 1103|回复: 0

[转] .NET下的FTP上传、下载文件操作类[收藏]

[复制链接]

尚未签到

发表于 2015-5-30 11:50:01 | 显示全部楼层 |阅读模式
  

DSC0000.gif .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
DSC0001.gif DSC0002.gif DSC0003.gif {
DSC0004.gif DSC0005.gif ?/**////?
DSC0006.gif ?///?FTP?操作类
DSC0007.gif ?///?
?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?

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-72153-1-1.html 上篇帖子: 替换用FTP传到Unix上的文件中的^M字符 下篇帖子: linux 目标机 windows 图形界面ftp登录
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表