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
  • 使用原因: 在我們服務端調用第三方介面時,如:支付寶,微信支付,我們服務端需要模擬http請求並加上一些自己的邏輯響應給前端最終達到我們想要的效果 1.使用WebClient 引用命名空間 using System.Net; using System.Collections.Specialized; ...
  • WPF 實現帶蒙版的 MessageBox 消息提示框 WPF 實現帶蒙版的 MessageBox 消息提示框 作者:WPFDevelopersOrg 原文鏈接: https://github.com/WPFDevelopersOrg/WPFDevelopers.Minimal 框架使用大於等於.N ...
  • 一、JSON(JavaScript Object Notation)的簡介: ① JSON和XML類似,主要用於存儲和傳輸文本信息,但是和XML相比,JSON更小、更快、更易解析、更易編寫與閱讀。 ② C、Python、C++、Java、PHP、Go等編程語言都支持JSON。 二、JSON語法規則: ...
  • 1.避免Scoped模式註冊的服務變成Singleton模式 當提供一個生命周期模式為Singleton的服務實例時,如果發現該服務中還依賴生命周期模式為Scoped的服務實例(Scoped服務實例將被一個Singleton服務實例所引用),那麼這個被依賴的Scoped服務實例最終會成為一個Sing ...
  • 索引時資料庫提高數據查詢處理性能的一個非常關鍵的技術,索引的使用可以對性能產生上百倍甚至上千倍的影響。接下來,會介紹索引的基本原理、概念,並深入學習資料庫中所使用的索引結構和存儲方式,以及如何管理、維護索引等。 1.索引的基本概念 索引時用來快速查詢表記錄的一種存儲結構,一般使用索引有一下兩個方面: ...
  • django2 路由控制器 Route路由,是一種映射關係。路由是把客戶端請求的url路徑和用戶請求的應用程式,這裡意指django裡面的視圖進行綁定映射的一種關係。 請求路徑和視圖函數不是一一對應的關係 在django中所有的路由最終都被保存到一個叫urlpatterns的文件里,並且該文件必須在 ...
  • 1、我們的目標是獲取微博某博主的全部圖片、視頻 2、拿到網址後 我們先觀察 打開F12 隨著下滑我們發現載入出來了一個叫mymblog的東西,展開響應發現需要的東西就在裡面 3、重點來了!!! 通過觀察發現第二頁比第一頁多了參數since_id 而第二頁的since_id參數剛好在上一頁中能獲取到, ...
  • 一、實現原理 在Servlet3協議規範中,包含在JAR文件/META-INFO/resources/路徑下的資源可以直接訪問。 二、舉例說明 如下圖所示,是我新建的一個Spring Boot Starter項目:zimug-minitor-threadpool,用於實現可配置、可觀測的線程池。其中 ...
  • 精華筆記: static final常量:應用率高 必須聲明同時初始化 由類名打點來訪問,不能被改變 建議:常量所有字母都大寫,多個單詞用_分隔 編譯器在編譯時會將常量直接替換為具體的數,效率高 何時用:數據永遠不變,並且經常使用 抽象方法: 由abstract修飾 只有方法的定義,沒有具體的實現( ...
  • Python有一個for...else語法,它的寫法如下 for i in range(0,100): if i == 3: break else: print("Not found") 該語句表示:若for迴圈遍歷完畢,則執行else部分的語句。也就是說上述代碼不會有任何輸出,而下述代碼會輸出“N ...