无恨星晨 通过本文主要向大家介绍了client helper,ftpclient类,ftpclient,filezilla ftp client,ftpclient api等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
文档说明
本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行
1.基本介绍
由于最近的项目是客户端的程序,需要将客户端的图片文件【切图】-【打包】-【ftp上传】,现在就差最后一步了,慢慢的把这些小功能实现了,合并到一起就是一个大功能了,所以一个业务需要拆分的很小很小才可以看清楚,这个项目实际需要用到哪些知识点,下面介绍一下ftp上传的命令
ftp命令的参考链接:http://www.weikejianghu.com/article/12199.htm
ftp适合小文件上传
对带宽要求要求较高
服务器安全性也要考虑到
命令需要熟悉,不然比较难
2.实际项目
文件上传
文件下载
删除文件
创建文件夹
文件夹重命名
删除文件夹
改变目录
获取文件夹中文件列表
等等
2.1 图片上传和下载

写了几个方法,一般用的最多的就是Put,具体的可以下载复制源码下来进行实战一下。
2.2 目录创建和删除

这个方法今天刚好用上了,折腾了一会,才搞定的。
3.调用代码参考
由于这个帮助类不是静态的,所以需要实例化
string userName = "xxx";
string password = "xxx";
var ftp = new FTPClientHelper("xxx", ".", userName, password, 1021);
</div>
下面还是调用常用的方法,就可以了,因为账号、密码、服务器的IP地址都被我用“xxx”代替了,所以大家自己改下,还有ftp默认端口号是:1021,如果有变动还是需要自己改下的。
4.FTPClientHelper下载
//-------------------------------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2015 , ZTO , Ltd .
//-------------------------------------------------------------------------------------
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace ZTO.PicTest.Utilities
{
/// <summary>
/// FTP操作帮助类
///
/// 修改纪录
///
/// 2016-4-4 版本:1.0 YangHengLian 创建主键,注意命名空间的排序,测试非常好。
///
/// 版本:1.0
///
/// <author>
/// <name>YangHengLian</name>
/// <date>2016-4-4</date>
/// </author>
/// </summary>
public class FTPClientHelper
{
public static object Obj = new object();
#region 构造函数
/// <summary>
/// 缺省构造函数
/// </summary>
public FTPClientHelper()
{
RemoteHost = "";
_strRemotePath = "";
_strRemoteUser = "";
_strRemotePass = "";
_strRemotePort = 21;
_bConnected = false;
}
/// <summary>
/// 构造函数
/// </summary>
public FTPClientHelper(string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort)
{
// Ip地址
RemoteHost = remoteHost;
// 这个很重要,表示连接路径,如果是.表示根目录
_strRemotePath = remotePath;
// 登录账号
_strRemoteUser = remoteUser;
// 登录密码
_strRemotePass = remotePass;
// ftp端口号
_strRemotePort = remotePort;
Connect();
}
#endregion
#region 字段
private int _strRemotePort;
private Boolean _bConnected;
private string _strRemotePass;
private string _strRemoteUser;
private string _strRemotePath;
/// <summary>
/// 服务器返回的应答信息(包含应答码)
/// </summary>
private string _strMsg;
/// <summary>
/// 服务器返回的应答信息(包含应答码)
/// </summary>
private string _strReply;
/// <summary>
/// 服务器返回的应答码
/// </summary>
private int _iReplyCode;
/// <summary>
/// 进行控制连接的socket
/// </summary>
private Socket _socketControl;
/// <summary>
/// 传输模式
/// </summary>
private TransferType _trType;
/// <summary>
/// 接收和发送数据的缓冲区
/// </summary>
private const int BlockSize = 512;
/// <summary>
/// 编码方式
/// </summary>
readonly Encoding _ascii = Encoding.ASCII;
/// <summary>
/// 字节数组
/// </summary>
readonly Byte[] _buffer = new Byte[BlockSize];
#endregion
#region 属性
/// <summary>
/// FTP服务器IP地址
/// </summary>
public string RemoteHost { get; set; }
/// <summary>
/// FTP服务器端口
/// </summary>
public int RemotePort
{
get
{
return _strRemotePort;
}
set
{
_strRemotePort = value;
}
}
/// <summary>
/// 当前服务器目录
/// </summary>
public string RemotePath
{
get
{
return _strRemotePath;
}
set
{
_strRemotePath = value;
}
}
/// <summary>
/// 登录用户账号
/// </summary>
public string RemoteUser
{
set
{
_strRemoteUser = value;
}
}
/// <summary>
/// 用户登录密码
/// </summary>
public string RemotePass
{
set
{
_strRemotePass = value;
}
}
/// <summary>
/// 是否登录
/// </summary>
public bool Connected
{
get
{
return _bConnected;
}
}
#endregion
#region 链接
/// <summary>
/// 建立连接
/// </summary>
public void Connect()
{
lock (Obj)
{
_socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var ep = new IPEndPoint(IPAddress.Parse(RemoteHost), _strRemotePort);
try
{
_socketControl.Connect(ep);
}
catch (Exception)
{
throw new IOException("不能连接ftp服务器");
}
}
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);
}
/// <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)
{
SendCommand(ttType == TransferType.Binary ? "TYPE I" : "TYPE A");
if (_iReplyCode != 200)
{
throw new IOException(_strReply.Substring(4));
}
_trType = ttType;
}

