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
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...