C#實現FTP服務端和客戶端

来源:https://www.cnblogs.com/timefiles/archive/2022/08/05/CsharpFTP.html
-Advertisement-
Play Games

簡介 FTP是FileTransferProtocol(文件傳輸協議)的英文簡稱,而中文簡稱為“文傳協議”。用於Internet上的控制文件的雙向傳輸。同時,它也是一個應用程式(Application)。基於不同的操作系統有不同的FTP應用程式,而所有這些應用程式都遵守同一種協議以傳輸文件。 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.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));
     }
}

附件


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JProfiler 是一個功能強大的工具,您可以使用它以動態方式分析基於 Java 的應用程式,並使您能夠分析它們以優化性能。當您配置文件時,您需要最強大的工具。同時,您不想花時間學習如何使用該工具。JProfiler 就是這樣:既簡單又強大。 Mac版詳情:JProfiler 13 for Mac ...
  • 雙向鏈表與數據結構 引言 在上小節中 我們分析了ArrayList的底層實現, 知道了ArrayList底層是基於數組實現的,因此具有查找修改快而插入、刪除慢的特點 本章我們介紹的LinkedList是List介面的另一種實現 它的底層是基於雙向鏈表實現的 因此它具有插入、刪除快而查找修改慢的特點 ...
  • 大家好,我是Mic,一個工作了14年的Java程式員。 最近很多小伙伴私信我,讓我說一些線程池相關的問題。 線程池這個方向考察的點還挺多的,如果只是靠刷面試題 面試官很容易就能識別出來,我隨便舉幾個。 線程池是如何實現線程的回收的 核心線程是否能夠回收 當調用線程池的shutdown方法,會發生什麼 ...
  • 前言 最近複習操作系統,看到了lru演算法,就去網上搜索下,因此發現了GeeCache,順手寫了一遍。研究下lru演算法的實現。 正文: lru使用map+鏈表實現。map裡面存儲了key以及其對應的鏈表節點。當我們根據某個key訪問緩存值的時候,可以經過map快速定位到該鏈表節點。從而獲取值 下麵我們 ...
  • 什麼是商城系統?商城系統又稱線上商城系統,是一個功能完善的線上購物系統,主要為線上銷售和線上購物服務。 一般的商城系統運營模式有B2C單商戶商城系統,B2B2C多商戶商城系統以及SAAS運營版。但是搭建一個商城系統過程很麻煩,這時候我們這些現成的來幫忙啦!likeshop是一個100%開源免費商用而 ...
  • 繼 Tabby、Warp 後,今天再來給大家推薦一款終端神器——WindTerm,完全開源,在 GitHub 上已經收穫 6.6k 的 star。 https://github.com/kingToolbox/WindTerm 作者還拿 WindTerm 和 Putty、xterm、Windows ...
  • 一、前言 我們在實際開發中肯定會遇到後端的時間傳到前端是這個樣子的:2022-08-02T15:43:50 這個時候前後端就開始踢皮球了,!! 後端說:前端來做就可! 前端說:後端來做就可! 作為一名有責任感的後端,這種事情怎麼能讓前端來搞呢! 還有就是Long類型的返回到前端可能會損失精度,這個情 ...
  • 在上一遍文章中已經介紹了PixelShaderEffect 用hlsl(著色器) 可以實現各種自定義濾鏡效果了,本文將用 "ThresholdEffect" 來講解如何編寫,編譯hlsl,然後使用PixelShaderEffect製作自定義濾鏡。 效果圖: 一.hlsl幫助程式介紹 在寫hlsl 代 ...
一周排行
    -Advertisement-
    Play Games
  • 前言:有時候遠程伺服器的進程你想偷偷去圍觀一下有哪些,或者對一些比較調皮的進程進行封殺,或者對一些自己研發的服務進行遠程手動啟動或者重啟等,又不想打開遠程桌面,只想悄咪咪地執行,那也許下麵的文章會對你有啟發。 前提條件 確保遠程伺服器(服務端)已啟用WinRM。在遠程伺服器上運行以下命令可以啟用和配 ...
  • 爆了,爆了,DeveloperSharp系列近期又被製造業ERP、民航飛行App、建築BIM、電力掌上營業廳、等多家大型採用,站在巨人的肩膀上你能走的更遠。 支持.Net Core2.0及以上,支持.Net Framework4.0及以上 http請求調用是開發中經常會用到的功能。在內,調用自有項目 ...
  • StackExchange.Redis 是一個高性能的 Redis 客戶端庫,主要用於 .NET 環境下與 Redis 伺服器進行通信,大名鼎鼎的stackoverflow 網站就使用它。它使用非同步編程模型,能夠高效處理大量請求。支持 Redis 的絕大部分功能,包括發佈/訂閱、事務、Lua 腳本等... ...
  • 一:背景 1. 講故事 前些天群里有一個朋友說他們軟體會偶發崩潰,想分析看看是怎麼回事,所幸的是自己會抓dump文件,有了dump就比較好分析了,接下來我們開始吧。 二:WinDbg 分析 1. 程式為什麼會崩潰 windbg 還是非常強大的,當你雙擊打開的時候會自動幫你定位過去展示崩潰時刻的寄存器 ...
  • 工廠模式(Factory Pattern)是一種創建型設計模式,它提供了一種創建對象的介面,而不是通過具體類來實例化對象。工廠模式可以將對象的創建過程封裝起來,使代碼更具有靈活性和可擴展性。 工廠模式有幾種常見的實現方式: 簡單工廠模式(Simple Factory Pattern): 簡單工廠模式 ...
  • Web Service 理解:Web Service 是一種基於網路的服務,它使用標準化的消息傳遞協議,最典型的是基於 SOAP(Simple Object Access Protocol)協議。SOAP 使用 XML 格式封裝數據,定義了消息的結構和傳輸方式,因此它是一個重量級的解決方案。Web ...
  • 可以使用XmlSerializer直接序列化和反序列化xml 反序列化如以下代碼 private T? XmlDeseriallize<T>(string filePath) { XmlSerializer serializer = new XmlSerializer(typeof(T)); usi ...
  • 不管是在控制台程式還是asp.net core程式中,我們經常會有用到一個需要長時間運行的後臺任務的需求。通常最直覺的方式是使用Thread實例來新建一個線程,但是這樣需要自行管理線程的啟動和停止。 在.net core中提供了一個繼承自IHostedService的基類BackgroudServi ...
  • 最近YOLO家族又添新成員:YOLOv10,YOLOv10 提出了一種一致的雙任務方法,用於無nms訓練的YOLOs,它同時帶來了具有競爭力的性能和較低的推理延遲。此外,還介紹了整體效率-精度驅動的模型設計策略,從效率和精度兩個角度對YOLOs的各個組成部分進行了全面優化,大大降低了計算開銷,增強了... ...
  • 自動篩選器是 Excel 中的一個基本但極其有用的功能,它可以讓你根據特定的條件來自動隱藏和顯示你的數據。當有大量的數據需要處理時,這個功能可以幫你快速找到你需要的信息,從未更加有效地分析和處理相關數據。 下麵將介紹如何使用免費.NET Excel庫在Excel中添加、應用和刪除自動篩選器。包含以下 ...