简介

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.DependencyInjectionFubarDev.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服务端和客户端的更多相关文章

  1. python thrift 服务端与客户端使用

    一.简介 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, ...

  2. C# 编写WCF简单的服务端与客户端

    http://www.wxzzz.com/1860.html Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Win ...

  3. centos 6.5 ftp服务配置及客户端使用

    一.ftp服务简介 FTP是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Ap ...

  4. vsftpd:非常安全的ftp服务端程序

    主程序:/usr/sbin/vsftpd 主配置文件:/etc/vsftpd/vsftpd.conf CentOS 6  /etc/rc.d/init.d/vsftpd chkconfig vsftp ...

  5. asp.net获取服务端和客户端信息

    asp.net获取服务端和客户端信息 获取服务器名:Page.Server.ManchineName获取用户信息:Page.User 获取客户端电脑名:Page.Request.UserHostNam ...

  6. ftpget 从Windows FTP服务端获取文件

    /********************************************************************************* * ftpget 从Windows ...

  7. IE8下服务端获取客户端文件的路径为C:/fakePath问题的解决方案

    上一篇文章上提到,IE8下服务端获取客户端文件的路径时,会变成C:/fakePath问题,于是乎通过文件路径去获得文件大小就失败了. 上网搜了一下,主要原因是IE8因为安全考虑,在上传文件时屏蔽了真实 ...

  8. 如何排查APP服务端和客户端是否支持ATS

    服务端排查 取得客户端直接连接的服务端域名及端口,例如mob.com.cn,端口443,即HTTPS默认端口.针对公网可访问的生产环境地址,建议使用的在线监测工具.https://wosign.ssl ...

  9. (转)SVN 服务端、客户端安装及配置、导入导出项目

    SVN服务器搭建和使用(一) Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上 ...

  10. Android版Ftp服务端软件

    分享一款开发的Android版Ftp服务端软件,支持Android4.0及以上版本,可以实现局域网无线传输文件到手机,或者把手机上的多媒体文件分享到iPad等设备来扩展这些设备的存储空间,详情请见软件 ...

随机推荐

  1. Python 调用Zoomeye搜索接口

    钟馗之眼是一个强大的搜索引擎,不同于百度谷歌,它主要收集网络中的主机,服务等信息,国内互联网安全厂商知道创宇开放了他们的海量数据库,对之前沉淀的数据进行了整合.整理,打造了一个名符其实的网络空间搜索引 ...

  2. C/C++ 使用CRC检测内存映像完整性

    前面的那一篇文章中所使用的技术只能有效抵抗解密者直接修改硬盘文件,当我们使用动态补丁的时候,那么内存中同样不存在校验效果,也就无法抵御对方动态修改机器码了,为了防止解密者直接对内存打补丁,我们需要在硬 ...

  3. 从嘉手札<2024-1-10.2>

    我们每个人都是在受挫中成长起来的 你不能剥夺他人在受苦中获益的权利 大部分人对吃苦的含义可能理解的太肤浅了 穷并不是吃苦 吃苦的本质是长时间为了某个目标而聚焦的能力 在这个过程中放弃娱乐生活.放弃无效 ...

  4. Win10已死!微软发布Windows 11大更新:引入ChatGPT、升级巨大

    今天凌晨微软在开发者大会上公布了Windows 11的新版本更新"Moment 3",整体升级幅度非常的大. 新系统的多任务有了改进,现在按下Alt+Tab时,可以显示更多的Edg ...

  5. 在Visual Studio中部署GDAL库的C++版本(包括SQLite、PROJ等依赖)

      本文介绍在Visual Studio软件中配置.编译C++环境下GDAL库.SQLite环境与PROJ库的详细方法.   GDAL库是一个非常方便的地理数据处理库,但其在C++环境下的配置与编译流 ...

  6. CH59X/CH58X/CH57X sleep模式下串口唤醒收发数据

    整体程序逻辑: 下方的具体程序及使用是基于CH592进行的 SLEEP模式睡眠唤醒是由协议栈管理的,还在睡眠时,无法接收到数据. 已经通过使能HAL_SLEEP开启睡眠.如果需要在睡眠时实时接收串口传 ...

  7. .NET Core开发实战(第28课:工作单元模式(UnitOfWork):管理好你的事务)--学习笔记

    28 | 工作单元模式(UnitOfWork):管理好你的事务 工作单元模式有如下几个特性: 1.使用同一上下文 2.跟踪实体的状态 3.保障事务一致性 我们对实体的操作,最终的状态都是应该如实保存到 ...

  8. .NET Core开发实战(第22课:异常处理中间件:区分真异常与逻辑异常)--学习笔记(下)

    接下来介绍使用代理方法的方式,也就是说把 ErrorController 整段逻辑直接定义在注册的地方,使用一个匿名委托来处理,这里的逻辑与之前的逻辑是相同的 app.UseExceptionHand ...

  9. 从零开始手写 mybatis(四)- mybatis 事务管理机制详解

    前景回顾 第一节 从零开始手写 mybatis(一)MVP 版本 中我们实现了一个最基本的可以运行的 mybatis. 第二节 从零开始手写 mybatis(二)mybatis interceptor ...

  10. 从零开始手写 mybatis(一)MVP 版本

    什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyB ...