C#实现FTP服务端和客户端

打印 上一主题 下一主题

主题 617|帖子 617|积分 1851

目录

简介

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 库,代码如下:
  1. //创建FTP客户端并指定主机、用户名和密码(删除凭据以使用“匿名”帐户)
  2. FtpClient client = new FtpClient("123.123.123.123", "david", "pass123");
  3. //连接到服务器并自动检测工作FTP设置
  4. client.AutoConnect();
  5. //获取“/htdocs”文件夹中的文件和目录列表
  6. foreach (FtpListItem item in client.GetListing("/htdocs"))
  7. {
  8.     //如果这是一个文件
  9.     if (item.Type == FtpFileSystemObjectType.File)
  10.     {
  11.         //获取文件大小
  12.         long size = client.GetFileSize(item.FullName);
  13.         //计算服务器端文件的哈希值(默认算法)
  14.         FtpHash hash = client.GetChecksum(item.FullName);
  15.     }
  16.     //获取文件或文件夹的修改日期/时间
  17.     DateTime time = client.GetModifiedTime(item.FullName);
  18. }
  19. //上载文件
  20. client.UploadFile(@"C:\MyVideo.mp4", "/htdocs/MyVideo.mp4");
  21. //移动上载的文件
  22. client.MoveFile("/htdocs/MyVideo.mp4", "/htdocs/MyVideo_2.mp4");
  23. //再次下载文件
  24. client.DownloadFile(@"C:\MyVideo_2.mp4", "/htdocs/MyVideo_2.mp4");
  25. //将下载的文件与服务器进行比较
  26. if (client.CompareFile(@"C:\MyVideo_2.mp4", "/htdocs/MyVideo_2.mp4") == FtpCompareResult.Equal) { }
  27. //删除文件
  28. client.DeleteFile("/htdocs/MyVideo_2.mp4");
  29. //上载文件夹及其所有文件
  30. client.UploadDirectory(@"C:\website\videos", @"/public_html/videos", FtpFolderSyncMode.Update);
  31. //上载文件夹及其所有文件,并删除服务器上的其他文件
  32. client.UploadDirectory(@"C:\website\assets", @"/public_html/assets", FtpFolderSyncMode.Mirror);
  33. //下载文件夹及其所有文件
  34. client.DownloadDirectory(@"C:\website\logs", @"/public_html/logs", FtpFolderSyncMode.Update);
  35. //下载文件夹及其所有文件,并删除磁盘上的其他文件
  36. client.DownloadDirectory(@"C:\website\dailybackup", @"/public_html/", FtpFolderSyncMode.Mirror);
  37. //递归删除文件夹
  38. client.DeleteDirectory("/htdocs/extras/");
  39. //检查文件是否存在
  40. if (client.FileExists("/htdocs/big2.txt")) { }
  41. //检查文件夹是否存在
  42. if (client.DirectoryExists("/htdocs/extras/")) { }
  43. //上载文件并重试3次,然后放弃
  44. client.RetryAttempts = 3;
  45. client.UploadFile(@"C:\MyVideo.mp4", "/htdocs/big.txt", FtpRemoteExists.Overwrite, false, FtpVerify.Retry);
  46. //断开再见!
  47. client.Disconnect();
复制代码
FTP服务端

系统服务端

参考 Win10--开启FTP的方法Windows10上怎样开启FTP服务

  • 启用FTP和IIS
  • 添加FTP站点
  • 设置身份验证
  • 设置防火墙
服务端软件

FTP服务端软件推荐使用Quick Easy FTP Server V4.0.0,界面如下:

自定义服务端

自定义服务器使用 FubarDev.FtpServer 库,代码如下
  1. // 设置依赖项注入
  2. var services = new ServiceCollection();
  3. // 使用%TEMP%/TestFtpServer作为根文件夹
  4. services.Configure<DotNetFileSystemOptions>(opt => opt
  5.      .RootPath = Path.Combine(Path.GetTempPath(), "TestFtpServer"));
  6. // 添加FTP服务器服务
  7. // DotNetFileSystemProvider = 使用.NET文件系统功能
  8. // AnonymousMembershipProvider = 仅允许匿名登录
  9. services.AddFtpServer(builder =>
  10. {
  11.      builder.UseDotNetFileSystem(); // 使用.NET文件系统功能
  12.      builder.EnableAnonymousAuthentication();// 允许匿名登录
  13.      /builder.Services.AddSingleton<IMembershipProvider, TestMembershipProvider>();//用户登录
  14. } );
  15. // 配置FTP服务器
  16. services.Configure<FtpServerOptions>(opt => opt.ServerAddress = "127.0.0.1");
  17. // 构建服务提供商
  18. using (var serviceProvider = services.BuildServiceProvider())
  19. {
  20.      // 初始化FTP服务器
  21.      var ftpServerHost = serviceProvider.GetRequiredService<IFtpServerHost>();
  22.      // 启动FTP服务器
  23.      ftpServerHost.StartAsync(CancellationToken.None).Wait();
  24.      Console.WriteLine("Press ENTER/RETURN to close the test application.");
  25.      Console.ReadLine();
  26.      // 停止FTP服务器
  27.      ftpServerHost.StopAsync(CancellationToken.None).Wait();
  28. }
复制代码
需要先安装 Microsoft.Extensions.DependencyInjection  和 FubarDev.FtpServer.FileSystem.DotNet,完整的创建过程如下:
  1. dotnet new console
  2. dotnet add package FubarDev.FtpServer.FileSystem.DotNet
  3. dotnet add package FubarDev.FtpServer
  4. dotnet add package Microsoft.Extensions.DependencyInjection
复制代码
官方的示例只有匿名登录,如果想使用用户校验,需要自己实现IMembershipProvider接口,代码如下:
  1. public class TestMembershipProvider : IMembershipProvider
  2. {
  3.    
  4.     public Task<MemberValidationResult> ValidateUserAsync(string username, string password)
  5.     {
  6.         if (username == "admin" && password == "admin")
  7.         {
  8.             var identity = new ClaimsIdentity();
  9.             identity.AddClaim(new Claim(ClaimTypes.Name, username));
  10.             identity.AddClaim(new Claim(ClaimTypes.Role, "admin"));
  11.             return Task.FromResult(new MemberValidationResult(MemberValidationStatus.AuthenticatedUser, new ClaimsPrincipal(identity)));
  12.         }
  13.         return Task.FromResult(new MemberValidationResult(MemberValidationStatus.InvalidLogin));
  14.      }
  15. }
复制代码
附件


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表