C#实现FTP服务端和客户端
简介
FTP是FileTransferProtocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。
FTP客户端
系统客户端
参考文章 文件资源管理器访问ftp服务器 ,在资源管理器输入框中输入 ftp://127.0.0.1/ ,如下所示:

客户端软件
WinSCP 是一个流行的 SFTP 客户端和 Microsoft Windows 的 FTP 客户端!使用在本地计算机和远程服务器之间复制文件FTP、FTPS、SCP、SFTP、WebDAV 或 S3 文件传输协议。
官网:https://winscp.net/eng/index.php
github:https://github.com/winscp/winscp
WinSCP也支持C#调用,参考 WinSCP .NET 程序集和 COM 库。
自定义客户端
自定义客户端使用 FluentFTP 库,代码如下:
//创建FTP客户端并指定主机、用户名和密码(删除凭据以使用“匿名”帐户)
FtpClient client = new FtpClient("123.123.123.123", "david", "pass123");
//连接到服务器并自动检测工作FTP设置
client.AutoConnect();
//获取“/htdocs”文件夹中的文件和目录列表
foreach (FtpListItem item in client.GetListing("/htdocs"))
{
//如果这是一个文件
if (item.Type == FtpFileSystemObjectType.File)
{
//获取文件大小
long size = client.GetFileSize(item.FullName);
//计算服务器端文件的哈希值(默认算法)
FtpHash hash = client.GetChecksum(item.FullName);
}
//获取文件或文件夹的修改日期/时间
DateTime time = client.GetModifiedTime(item.FullName);
}
//上载文件
client.UploadFile(@"C:\MyVideo.mp4", "/htdocs/MyVideo.mp4");
//移动上载的文件
client.MoveFile("/htdocs/MyVideo.mp4", "/htdocs/MyVideo_2.mp4");
//再次下载文件
client.DownloadFile(@"C:\MyVideo_2.mp4", "/htdocs/MyVideo_2.mp4");
//将下载的文件与服务器进行比较
if (client.CompareFile(@"C:\MyVideo_2.mp4", "/htdocs/MyVideo_2.mp4") == FtpCompareResult.Equal) { }
//删除文件
client.DeleteFile("/htdocs/MyVideo_2.mp4");
//上载文件夹及其所有文件
client.UploadDirectory(@"C:\website\videos\", @"/public_html/videos", FtpFolderSyncMode.Update);
//上载文件夹及其所有文件,并删除服务器上的其他文件
client.UploadDirectory(@"C:\website\assets\", @"/public_html/assets", FtpFolderSyncMode.Mirror);
//下载文件夹及其所有文件
client.DownloadDirectory(@"C:\website\logs\", @"/public_html/logs", FtpFolderSyncMode.Update);
//下载文件夹及其所有文件,并删除磁盘上的其他文件
client.DownloadDirectory(@"C:\website\dailybackup\", @"/public_html/", FtpFolderSyncMode.Mirror);
//递归删除文件夹
client.DeleteDirectory("/htdocs/extras/");
//检查文件是否存在
if (client.FileExists("/htdocs/big2.txt")) { }
//检查文件夹是否存在
if (client.DirectoryExists("/htdocs/extras/")) { }
//上载文件并重试3次,然后放弃
client.RetryAttempts = 3;
client.UploadFile(@"C:\MyVideo.mp4", "/htdocs/big.txt", FtpRemoteExists.Overwrite, false, FtpVerify.Retry);
//断开再见!
client.Disconnect();
FTP服务端
系统服务端
参考 Win10--开启FTP的方法、Windows10上怎样开启FTP服务:
- 启用FTP和IIS
- 添加FTP站点
- 设置身份验证
- 设置防火墙
服务端软件
FTP服务端软件推荐使用Quick Easy FTP Server V4.0.0,界面如下:

自定义服务端
自定义服务器使用 FubarDev.FtpServer 库,代码如下
// 设置依赖项注入
var services = new ServiceCollection();
// 使用%TEMP%/TestFtpServer作为根文件夹
services.Configure<DotNetFileSystemOptions>(opt => opt
.RootPath = Path.Combine(Path.GetTempPath(), "TestFtpServer"));
// 添加FTP服务器服务
// DotNetFileSystemProvider = 使用.NET文件系统功能
// AnonymousMembershipProvider = 仅允许匿名登录
services.AddFtpServer(builder =>
{
builder.UseDotNetFileSystem(); // 使用.NET文件系统功能
builder.EnableAnonymousAuthentication();// 允许匿名登录
/builder.Services.AddSingleton<IMembershipProvider, TestMembershipProvider>();//用户登录
} );
// 配置FTP服务器
services.Configure<FtpServerOptions>(opt => opt.ServerAddress = "127.0.0.1");
// 构建服务提供商
using (var serviceProvider = services.BuildServiceProvider())
{
// 初始化FTP服务器
var ftpServerHost = serviceProvider.GetRequiredService<IFtpServerHost>();
// 启动FTP服务器
ftpServerHost.StartAsync(CancellationToken.None).Wait();
Console.WriteLine("Press ENTER/RETURN to close the test application.");
Console.ReadLine();
// 停止FTP服务器
ftpServerHost.StopAsync(CancellationToken.None).Wait();
}
需要先安装 Microsoft.Extensions.DependencyInjection 和 FubarDev.FtpServer.FileSystem.DotNet,完整的创建过程如下:
dotnet new console
dotnet add package FubarDev.FtpServer.FileSystem.DotNet
dotnet add package FubarDev.FtpServer
dotnet add package Microsoft.Extensions.DependencyInjection
官方的示例只有匿名登录,如果想使用用户校验,需要自己实现IMembershipProvider接口,代码如下:
public class TestMembershipProvider : IMembershipProvider
{
public Task<MemberValidationResult> ValidateUserAsync(string username, string password)
{
if (username == "admin" && password == "admin")
{
var identity = new ClaimsIdentity();
identity.AddClaim(new Claim(ClaimTypes.Name, username));
identity.AddClaim(new Claim(ClaimTypes.Role, "admin"));
return Task.FromResult(new MemberValidationResult(MemberValidationStatus.AuthenticatedUser, new ClaimsPrincipal(identity)));
}
return Task.FromResult(new MemberValidationResult(MemberValidationStatus.InvalidLogin));
}
}
附件
C#实现FTP服务端和客户端的更多相关文章
- python thrift 服务端与客户端使用
一.简介 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, ...
- C# 编写WCF简单的服务端与客户端
http://www.wxzzz.com/1860.html Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Win ...
- centos 6.5 ftp服务配置及客户端使用
一.ftp服务简介 FTP是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Ap ...
- vsftpd:非常安全的ftp服务端程序
主程序:/usr/sbin/vsftpd 主配置文件:/etc/vsftpd/vsftpd.conf CentOS 6 /etc/rc.d/init.d/vsftpd chkconfig vsftp ...
- asp.net获取服务端和客户端信息
asp.net获取服务端和客户端信息 获取服务器名:Page.Server.ManchineName获取用户信息:Page.User 获取客户端电脑名:Page.Request.UserHostNam ...
- ftpget 从Windows FTP服务端获取文件
/********************************************************************************* * ftpget 从Windows ...
- IE8下服务端获取客户端文件的路径为C:/fakePath问题的解决方案
上一篇文章上提到,IE8下服务端获取客户端文件的路径时,会变成C:/fakePath问题,于是乎通过文件路径去获得文件大小就失败了. 上网搜了一下,主要原因是IE8因为安全考虑,在上传文件时屏蔽了真实 ...
- 如何排查APP服务端和客户端是否支持ATS
服务端排查 取得客户端直接连接的服务端域名及端口,例如mob.com.cn,端口443,即HTTPS默认端口.针对公网可访问的生产环境地址,建议使用的在线监测工具.https://wosign.ssl ...
- (转)SVN 服务端、客户端安装及配置、导入导出项目
SVN服务器搭建和使用(一) Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上 ...
- Android版Ftp服务端软件
分享一款开发的Android版Ftp服务端软件,支持Android4.0及以上版本,可以实现局域网无线传输文件到手机,或者把手机上的多媒体文件分享到iPad等设备来扩展这些设备的存储空间,详情请见软件 ...
随机推荐
- Object.getOwnPropertyDescriptor()属性
console.log(Object.getOwnPropertyDescriptor(person,'a')); // writable: 是否可以修改 // value: 对象值 // confi ...
- dropzone基本使用
dropzone是一个实现拖拽上传文件的一个插件. 生成拖拽区域 1 <div style="width: 1078px;margin: 0 auto;border: 2px ligh ...
- HanLP — 词性标注
词性(Part-Of-Speech,POS)指的是单词的语法分类,也称为词类.同一个类别的词语具有相似的语法性质 所有词性的集合称为词性标注集. 词性的用处 当下游应用遇到OOV时,可以通过OOV的词 ...
- 零基础入门学习Java之多线程
多线程 话不多说,看代码 1.什么是多线程 众所周知CPU单线程的东西,也就是说在同一时间内程序只能去做一件事情,但很多时候比如说多人买票.龟兔赛跑.游戏开发等都需要在同一时间内完成多个东西,因此就有 ...
- Linux-grep或和与操作
一.或(or)操作1.使用选项 -Egrep -E 'a1|a2'filename // 找出文件(filename)中包含a1或者包含a2的行 2.使用egrepegrep 'a1|a2' file ...
- Python-单引号、双引号和三引号的作用和区别
(一).作用 1. 单引号:单引号内部为一串字符(str). 2. 双引号:双引号内部为一串字符,双引号内的字符串可以出现单引号(相当于双引号优先级更高),但不能嵌套双引号. 3. 三引号:用于换行输 ...
- 如何使用graalvm为带有反射功能的java代码生成native image
译自Configure Native Image with the Tracing Agent graal官方文档 , 以下所有命令需要在linux环境下操作,graalvm也支持windows. 要 ...
- JS 一篇文章弄懂Object.defineProperty,现学现用,来试试相关笔试题吧
壹 ❀ 引 早在大半年前,掘金某位用户分享的面试题整理中有一题,简述let与const区别,你能自己模拟实现它们吗?,题目意思大概如此,时间久远我也很难找到那篇文章,当时看到此题对于const实现我的 ...
- 2023牛客暑期多校训练营3 ABDHJ
比赛链接 A 题解 知识点:数学. 当 \(x = 0\) 时,当且仅当 \(y = 0\) 可行. 当 \(x \neq 0\) 时,一定可行,答案为 \(|x-y|\) . 时间复杂度 \(O(1 ...
- ARM指针寄存器——堆栈指针寄存器SP、程序计数器PC、连接寄存器LR详解
堆栈的实现方法 在随机存储器区划出一块区域作为堆栈区,数据可以一个个顺序地存入(压入)到这个区域之中,这个过程称为'压栈'(push ).通常用一个指针(堆栈指针 SP-StackPointer ...