本文整理自网络,由于太多文章类似,此处标识其中一处:点击打开链接
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.IO;
using System.Net;
namespace JianKunKing.Common.Ftp
{
///
/// FTP Client(不允许匿名登录)
/// 上传、下载已测试,其余未测试
///
public class FTPClient
{
#region 构造函数
///
/// 缺省构造函数
///
public FTPClient()
{
this.ftpServerIP = "";
this.remoteFilePath = "";
this.ftpUserID = "";
this.ftpPassword = "";
this.ftpServerPort = 21;
this.bConnected = false;
}
///
/// 构造函数
///
/// FTP服务器IP地址
/// 当前服务器目录
/// Ftp 服务器登录用户账号
/// Ftp 服务器登录用户密码
/// FTP服务器端口
public FTPClient(string ftpServerIP, string remoteFilePath, string ftpUserID, string ftpPassword, int ftpServerPort, bool anonymousAccess = false)
{
this.ftpServerIP = ftpServerIP;
this.remoteFilePath = remoteFilePath;
this.ftpUserID = ftpUserID;
this.ftpPassword = ftpPassword;
this.ftpServerPort = ftpServerPort;
this.Connect();
}
#endregion
#region 登陆字段、属性
///
/// FTP服务器IP地址
///
private string ftpServerIP;
public string FtpServerIP
{
get
{
return ftpServerIP;
}
set
{
this.ftpServerIP = value;
}
}
///
/// FTP服务器端口
///
private int ftpServerPort;
public int FtpServerPort
{
get
{
return ftpServerPort;
}
set
{
this.ftpServerPort = value;
}
}
///
/// 当前服务器目录
///
private string remoteFilePath;
public string RemoteFilePath
{
get
{
return remoteFilePath;
}
set
{
this.remoteFilePath = value;
}
}
///
/// Ftp 服务器登录用户账号
///
private string ftpUserID;
public string FtpUserID
{
set
{
this.ftpUserID = value;
}
}
///
/// Ftp 服务器用户登录密码
///
private string ftpPassword;
public string FtpPassword
{
set
{
this.ftpPassword = value;
}
}
///
/// 是否登录
///
private bool bConnected;
public bool Connected
{
get
{
return this.bConnected;
}
}
#endregion
#region 链接
///
/// 建立连接
///
public void Connect()
{
socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ep = new IPEndPoint(IPAddress.Parse(FtpServerIP), ftpServerPort);
// 链接
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 " + ftpUserID);
if (!(iReplyCode == 331 || iReplyCode == 230))
{
CloseSocketConnect();//关闭连接
throw new IOException(strReply.Substring(4));
}
if (iReplyCode != 230)
{
SendCommand("PASS " + ftpPassword);
if (!(iReplyCode == 230 || iReplyCode == 202))
{
CloseSocketConnect();//关闭连接
throw new IOException(strReply.Substring(4));
}
}
bConnected = true;
// 切换到初始目录
if (!string.IsNullOrEmpty(remoteFilePath))
{
ChDir(remoteFilePath);
}
}
///
/// 关闭连接
///
public void DisConnect()
{
if (socketControl != null)
{
SendCommand("QUIT");
}
CloseSocketConnect();
}
#endregion
#region 传输模式
///
/// 传输模式:二进制类型、ASCII类型
///
public enum TransferType
{
Binary,
ASCII
};
///
/// 设置传输模式
///
/// 传输模式
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("LIST " + 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 += GB2312.GetString(buffer, 0, iBytes);
if (iBytes < buffer.Length)
{
break;
}
}
char[] seperator = { '\n' };
string[] strsFileList = strMsg.Split(seperator);
socketData.Close();//数据socket关闭时也会有返回码
if (iReplyCode != 226)
{
ReadReply();
if (iReplyCode != 226)
{
throw new IOException(strReply.Substring(4));
}
}
return strsFileList;
}
///
/// 获取文件大小
///
/// 文件名
/// 文件大小
public long GetFileSize(string strFileName)
{
if (!bConnected)
{
Connect();
}
SendCommand("SIZE " + Path.GetFileName(strFileName));
long lSize = 0;
if (iReplyCode == 213)
{
lSize = Int64.Parse(strReply.Substring(4));
}
else
{
throw new IOException(strReply.Substring(4));
}
return lSize;
}
///
/// 删除
///
/// 待删除文件名
public void Delete(string strFileName)
{
if (!bConnected)
{
Connect();
}
SendCommand("DELE " + strFileName);
if (iReplyCode != 250)
{
throw new IOException(strReply.Substring(4));
}
}
///
/// 重命名(如果新文件名与已有文件重名,将覆盖已有文件)
///
/// 旧文件名
/// 新文件名
public void Rename(string strOldFileName, string strNewFileName)
{
if (!bConnected)
{
Connect();
}
SendCommand("RNFR " + strOldFileName);
if (iReplyCode != 350)
{
throw new IOException(strReply.Substring(4));
}
// 如果新文件名与原有文件重名,将覆盖原有文件
SendCommand("RNTO " + strNewFileName);
if (iReplyCode != 250)
{
throw new IOException(strReply.Substring(4));
}
}
#endregion
#region 上传和下载
///
/// 下载一批文件
///
/// 文件名的匹配字符串
/// 本地目录(不得以\结束)
public void Download(string strFileNameMask, string strFolder)
{
if (!bConnected)
{
Connect();
}
string[] strFiles = Dir(strFileNameMask);
foreach (string strFile in strFiles)
{
if (!strFile.Equals(""))//一般来说strFiles的最后一个元素可能是空字符串
{
if (strFile.LastIndexOf(".") > -1)
{
Download(strFile.Replace("\r", ""), strFolder, strFile.Replace("\r", ""));
}
}
}
}
///
/// 下载目录
///
/// 要下载的文件名
/// 本地目录(不得以\结束)
/// 保存在本地时的文件名
public void Download(string strRemoteFileName, string strFolder, string strLocalFileName)
{
if (strLocalFileName.StartsWith("-r"))
{
string[] infos = strLocalFileName.Split(' ');
strRemoteFileName = strLocalFileName = infos[infos.Length - 1];
if (!this.bConnected)
{
this.Connect();
}
SetTransferType(TransferType.Binary);
if (strLocalFileName.Equals(""))
{
strLocalFileName = strRemoteFileName;
}
if (!File.Exists(strLocalFileName))
{
Stream st = File.Create(strLocalFileName);
st.Close();
}
FileStream output = new
FileStream(strFolder + "\\" + strLocalFileName, FileMode.Create);
Socket socketData = CreateDataSocket();
SendCommand("RETR " + strRemoteFileName);
if (!(iReplyCode == 150 || iReplyCode == 125
|| iReplyCode == 226 || iReplyCode == 250))
{
throw new IOException(strReply.Substring(4));
}
int receiveBytes = 0;
while (true)
{
int iBytes = socketData.Receive(buffer, buffer.Length, 0);
receiveBytes = receiveBytes + iBytes;
output.Write(buffer, 0, iBytes);
if (iBytes
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?