Ftp基础(四):C#连接使用Ftp(FluentFTP)
作为一个.net开发这,说到C#连接使用Ftp,我就想到了很早之前的使用WebRequest
来连接的方式,比如下载:
FtpWebRequest req = (FtpWebRequest)WebRequest.Create(new Uri("192.168.0.0:21/RootPath"));
req.Credentials = new NetworkCredential("admin", "123456");
req.KeepAlive = false;
req.UseBinary = true;
req.Method = WebRequestMethods.Ftp.DownloadFile;
using (var stream = System.IO.File.OpenWrite("file"))
{
using (FtpWebResponse response = (FtpWebResponse)(await req.GetResponseAsync()))
{
Stream ftpStream = response.GetResponseStream();
var buffer = new byte[81920];
int count = await ftpStream.ReadAsync(buffer, 0, buffer.Length);
while (count > 0)
{
await stream.WriteAsync(buffer, 0, count);
count = await ftpStream.ReadAsync(buffer, 0, buffer.Length);
}
ftpStream.Close();
}
}
现在应该不会有人还在这么用了吧,都2023-2024年了,这种用法早就过时了。
而今天要说的连接Ftp的方式,就是使用FluentFTP
包,我们可以使用Nuget安装
简单使用
FluentFTP
的使用方式很简单,直接创建客户端对象使用就可以了,举几个例子:
1、在40.0.0版本(不包含)之前,我只有一个FtpClient
对象,它既可以同步操作也可以异步操作,一个简单的例子:
//同步模式
var ftpClient = new FtpClient("192.168.139.128", 21, "admin", "123456");
//设置编码
ftpClient.Encoding = Encoding.UTF8;
//Ftp被动模式
ftpClient.DataConnectionType = FtpDataConnectionType.AutoPassive;
//开始连接
ftpClient.Connect();
//设置工作目录
ftpClient.SetWorkingDirectory("FtpRoot");
//上传
ftpClient.UploadFile("localImage.jpg", "remoteImage.jpg");
//下载
ftpClient.DownloadFile("localImage.jpg", "remoteImage.jpg");
//异步模式
var ftpClient = new FtpClient("192.168.139.128", 21, "admin", "123456");
//设置编码
ftpClient.Encoding = Encoding.UTF8;
//Ftp被动模式
ftpClient.DataConnectionType = FtpDataConnectionType.AutoPassive;
//开始连接
await ftpClient.ConnectAsync();
//设置工作目录
await ftpClient.SetWorkingDirectoryAsync("FtpRoot");
//上传
await ftpClient.UploadFileAsync("localImage.jpg", "remoteImage.jpg");
//下载
await ftpClient.DownloadFileAsync("localImage.jpg", "remoteImage.jpg");
2、从40.0.0版本开始,40.0.0版本及后续版本中,将FtpClient
做了区分,原FtpClient
只提供同步方式使用,增加了一个异步客户端AsyncFtpClient
,同时将原来众多的设置项封装在了一个 FtpConfig
对象中,还有其它的一些变动,总之与之前的版本相比变化还是挺大的,一个简单的例子:
//同步模式
var ftpClient = new FtpClient("192.168.139.128", "admin", "123456", 21);
//设置编码
ftpClient.Encoding = Encoding.UTF8;
//Ftp被动模式
ftpClient.Config.DataConnectionType = FtpDataConnectionType.AutoPassive;
//开始连接
ftpClient.Connect();
//设置工作目录
ftpClient.SetWorkingDirectory("FtpRoot");
//上传
ftpClient.UploadFile("localImage.jpg", "remoteImage.jpg");
//下载
ftpClient.DownloadFile("localImage.jpg", "remoteImage.jpg");
//异步模式
var ftpClient = new AsyncFtpClient("192.168.139.128", "admin", "123456", 21);
//设置编码
ftpClient.Encoding = Encoding.UTF8;
//Ftp被动模式
ftpClient.Config.DataConnectionType = FtpDataConnectionType.AutoPassive;
//开始连接
await ftpClient.Connect();
//设置工作目录
await ftpClient.SetWorkingDirectory("FtpRoot");
//上传
await ftpClient.UploadFile("localImage.jpg", "remoteImage.jpg");
//下载
await ftpClient.DownloadFile("localImage.jpg", "remoteImage.jpg");
用法很简单吧,随便它怎么变,我们都会用就行,下面以最新版本(48.0.3)说说几个常用的方法和属性
常用方法和属性
先说说属性吧,常用(或者常见)的属性有下面几个:
Host:Ftp地址
Port:端口,默认21
Credentials:认证信息,一般是用户账号和密码
IsConnected:是否已建立连接,已建立连接可能未认证
IsAuthenticated:是否已认证,建立在IsConnected之上
Status:状态
Encoding:编码,一般采用UTF-8
ServerOS:系统环境
ServerType:Ftp服务的类型,FluentFTP支持很多种Ftp服务器,可自定查看枚举类型
Logger:日志记录,这个属性类型变量好几次,所以尽量不要使用吧,但是可以作为调试bug使用。
曾经是Microsoft.Extensions.Logging.ILogger,现在是FluentFTP.IFtpLogger,在旧版本中,它只是一个委托字段(OnLogEvent)
Config:配置对象,在旧版本中,它里面的属性是直接放在FtpClient类中的,常用的几个配置有:
DataConnectionType:设置连接方式,一般主动模式建议用AutoActive,被动模式建议用AutoPassive
UploadDataType:上传所使用的传输模式
DownloadDataType:上传所使用的传输模式
DownloadZeroByteFiles:0字节的文件是否需要被下载
DownloadRateLimit:下载速度限制,0表示不限制,单位kb
UploadRateLimit:上传熟读显示,0表示不限制,单位kb
RetryAttempts:当上传或者下载失败是,重新尝试的次数
TimeZone:Ftp服务器时区,比如北京市UTC+8,所以写8表示北京时间
LocalTimeZone:本地时区,格式同TimeZone
EncryptionMode:加密模式,一般采用Ftps会用到
SslProtocols:加密协议,一般采用Ftps会用到
IsEncrypted:表示当前是否在Ftps协议下使用
ValidateCertificate:证书验证事件,一般采用Ftps会用到
常用方法如下:
1、上传
UploadBytes:上传文件,文件格式是byte数组
UploadDirectory:上传整个本地目录到服务器
UploadFile:上传文件,文件格式是本地文件路径
UploadFiles:上传多个本地文件到服务器指定目录
UploadStream:上传文件,文件格式是流
2、下载
DownloadBytes:下载文件,内容保存在指定的byte数组中
DownloadDirectory:下载远程目录至本地指定目录中
DownloadFile:下载文件,并保存在指定文件中
DownloadFiles:下载多个文件,并保存在指定目录下
DownloadStream:下载文件,内容保存在指定流中
3、其它文件操作
CompareFile:本地与远程文件进行比较,默认不会下载文件,直接比较文件大小和校验hash散列值
DeleteFile:删除远程文件
FileExists:远程文件是否存在
GetChecksum:获取远程文件的校验hash散列值
GetFileSize:获取远程文件大小
MoveFile:移动文件
Rename:重命名文件,建议使用MoveFile代替
4、目录操作
CreateDirectory:创建目录
DeleteDirectory:删除目录(及文件、子目录)
DirectoryExists:目录是否已存在
GetListing:获取指定目录(或者当前工作目录)下的所有文件及子目录
GetWorkingDirectory:获取当前的工作目录
SetWorkingDirectory:设置当前的工作目录
IsRoot:当前工作目录是否是根目录
MoveDirectory:移动远程目录到指定位置
Rename:重命名,建议使用MoveDirectory代替
EmptyDirectory:清空指定目录
5、其它常用操作
AutoDetect:自动发现FTP连接的设置并且返回这些连接的配置文件
AutoConnect:自动发现FTP连接的设置并且使用第一个配置去连接服务器
Chmod:授权,仅UNIX类型的系统有效,Windows下无效
SetFilePermissions:同Chmod
GetChmod:获取文件/目录的授权信息
GetFilePermissions:同GetChmod,只是返回的结果是枚举类型
Connect:开始连接
Disconnect:断开连接
结语
这篇就写这么多吧,没什么好说的,应该都是些很简单的用法,参数看看名称应该也能理解吧,至于FluentFTP
的一些高级用法,一般也用不上,感兴趣的可以自行了解下,比如,我们可以自己写上传的逻辑,而不是调用各种Upload
方法,再比如,我们可以直接使用Ftp的各命令来操作。
一个专注于.NetCore的技术小白