欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#利用FluentFTP實(shí)現(xiàn)FTP上傳下載功能詳解

 更新時(shí)間:2023年02月21日 16:35:25   作者:小六公子  
FTP作為日常工作學(xué)習(xí)中,非常重要的一個(gè)文件傳輸存儲(chǔ)空間,想必大家都非常的熟悉了,那么如何快速的實(shí)現(xiàn)文件的上傳下載功能呢,本文以一個(gè)簡(jiǎn)單的小例子,簡(jiǎn)述如何通過FluentFTP實(shí)現(xiàn)文件的上傳和下載功能

FTP作為日常工作學(xué)習(xí)中,非常重要的一個(gè)文件傳輸存儲(chǔ)空間,想必大家都非常的熟悉了,那么如何快速的實(shí)現(xiàn)文件的上傳下載功能呢,本文以一個(gè)簡(jiǎn)單的小例子,簡(jiǎn)述如何通過FluentFTP實(shí)現(xiàn)文件的上傳和下載功能。僅供學(xué)習(xí)分享使用,如有不足之處,還請(qǐng)指正。

FTP基礎(chǔ)知識(shí)

文件傳輸協(xié)議(File Transfer Protocol,F(xiàn)TP)是用于在網(wǎng)絡(luò)上進(jìn)行文件傳輸?shù)囊惶讟?biāo)準(zhǔn)協(xié)議,它工作在 OSI 模型的第七層, TCP 模型的第四層, 即應(yīng)用層, 使用 TCP 傳輸而不是 UDP, 客戶在和服務(wù)器建立連接前要經(jīng)過一個(gè)“三次握手”的過程, 保證客戶與服務(wù)器之間的連接是可靠的, 而且是面向連接, 為數(shù)據(jù)傳輸提供可靠保證。FTP允許用戶以文件操作的方式(如文件的增、刪、改、查、傳送等)與另一主機(jī)相互通信。然而, 用戶并不真正登錄到自己想要存取的計(jì)算機(jī)上面而成為完全用戶, 可用FTP程序訪問遠(yuǎn)程資源, 實(shí)現(xiàn)用戶往返傳輸文件、目錄管理以及訪問電子郵件等等, 即使雙方計(jì)算機(jī)可能配有不同的操作系統(tǒng)和文件存儲(chǔ)方式。

FTP環(huán)境搭建

在windows操作系統(tǒng)中,F(xiàn)TP可以通過(Internet Inforamtion Services, IIS)管理器進(jìn)行創(chuàng)建,創(chuàng)建成功后即可進(jìn)行查看,如下所示:

FluentFTP安裝

FluentFTP是一款基于.Net的FTP和FTPS的客戶端動(dòng)態(tài)庫,操作簡(jiǎn)單便捷。

首先創(chuàng)建基于.Net Framework 4.6.1的winform應(yīng)用程序,然后通過Nuget包管理器進(jìn)行安裝,如下所示:

示例演示

主要實(shí)現(xiàn)基于FTP的上傳,下載,瀏覽等功能,如下所示:

進(jìn)入文件夾及右鍵下載,如下所示:

示例源碼

FtpHelper類源碼,封裝了FTP文件的檢索,上傳,下載等功能,如下所示:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using FluentFTP;

namespace DemoFtp
{
    public class FtpHelper
    {
        #region 屬性與構(gòu)造函數(shù)

        /// <summary>
        /// IP地址
        /// </summary>
        public string IpAddr { get; set; }

        /// <summary>
        /// 相對(duì)路徑
        /// </summary>
        public string RelatePath { get; set; }

        /// <summary>
        /// 端口號(hào)
        /// </summary>
        public int Port { get; set; }

        /// <summary>
        /// 用戶名
        /// </summary>
        public string UserName { get; set; }

        /// <summary>
        /// 密碼
        /// </summary>
        public string Password { get; set; }

        public FtpHelper()
        {

        }

        public FtpHelper(string ipAddr, int port, string userName, string password, string relatePath)
        {
            this.IpAddr = ipAddr;
            this.Port = port;
            this.UserName = userName;
            this.Password = password;
            this.RelatePath = relatePath;
        }

        #endregion

        #region 方法

        public FtpListItem[] ListDir() {
            FtpListItem[] lists;
            using (var ftpClient = new FtpClient(this.IpAddr, this.UserName, this.Password, this.Port))
            {
                ftpClient.Connect();
                ftpClient.SetWorkingDirectory(this.RelatePath);
                lists = ftpClient.GetListing();
            }
            return lists;
        }

        public void UpLoad(string dir, string file, out bool isOk)
        {
            isOk = false;
            FileInfo fi = new FileInfo(file);
            using (FileStream fs = fi.OpenRead())
            {
                //long length = fs.Length;
                using (var ftpClient = new FtpClient(this.IpAddr, this.UserName, this.Password, this.Port))
                {
                    ftpClient.Connect();
                    ftpClient.SetWorkingDirectory(this.RelatePath);
                    string remotePath = dir + "/" + Path.GetFileName(file);
                    var ftpRemodeExistsMode = file.EndsWith(".txt") ? FtpRemoteExists.Overwrite : FtpRemoteExists.Skip;
                    FtpStatus status = ftpClient.UploadStream(fs, remotePath, ftpRemodeExistsMode, true);
                    isOk = status == FtpStatus.Success;

                }
            }

        }

        /// <summary>
        /// 上傳多個(gè)文件
        /// </summary>
        /// <param name="files"></param>
        /// <param name="isOk"></param>
        public void UpLoad(string dir, string[] files, out bool isOk)
        {
            isOk = false;
            if (CheckDirIsExists(dir))
            {
                foreach (var file in files)
                {
                    UpLoad(dir, file, out isOk);
                }
            }
        }


        private bool CheckDirIsExists(string dir)
        {
            bool flag = false;
            using (var ftpClient = new FtpClient(this.IpAddr, this.UserName, this.Password, this.Port))
            {
                ftpClient.Connect();
                ftpClient.SetWorkingDirectory(this.RelatePath);
                flag = ftpClient.DirectoryExists(dir);
                if (!flag)
                {
                    flag = ftpClient.CreateDirectory(dir);
                }
            }
            return flag;


        }

        /// <summary>
        /// 下載ftp
        /// </summary>
        /// <param name="localAddress"></param>
        /// <param name="remoteAddress"></param>
        /// <returns></returns>
        public bool DownloadFile(string localAddress, string remoteAddress)
        {
            using (var ftpClient = new FtpClient(this.IpAddr, this.UserName, this.Password, this.Port))
            {
                ftpClient.SetWorkingDirectory("/");
                ftpClient.Connect();
                if (ftpClient.DownloadFile(localAddress, remoteAddress) == FtpStatus.Success)
                {
                    return true;
                }
                return false;
            }
        }

        #endregion
    }
}

每一個(gè)FTP文件或文件夾,由一個(gè)自定義用戶控件【PictureBox+Label+ContextMenu】表示,這樣便于處理與顯示:

using DemoFtp.Properties;
using FluentFTP;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DemoFtp
{
    public partial class FtpElementControl : UserControl
    {
        public Action<FtpListItem> SubFolderClick;

        public Action<FtpListItem> DownLoadClick;

        private FtpListItem ftpListItem;

        public FtpElementControl(FtpListItem ftpListItem)
        {
            InitializeComponent();
            this.ftpListItem = ftpListItem;
        }

        public FtpElementControl()
        {
            InitializeComponent();
        }

        public void InitControl()
        {
            if (ftpListItem.Type == FtpObjectType.Directory)
            {
                this.pbIcon.Image = Resources.folder.ToBitmap();
            }
            else if (ftpListItem.Type == FtpObjectType.File)
            {
                var name = ftpListItem.Name;
                var ext = Path.GetExtension(name).ToLower().Substring(1);
                if (ext == "png" || ext == "jpeg" || ext == "jpg" || ext == "bmp" || ext == "gif")
                {
                    this.pbIcon.Image = Resources.pictures.ToBitmap();
                }
                else if (ext == "doc" || ext == "docx")
                {
                    this.pbIcon.Image = Resources.doc.ToBitmap();
                }
                else if (ext == "exe")
                {
                    this.pbIcon.Image = Resources.setup.ToBitmap();
                }
                else
                {
                    this.pbIcon.Image = Resources.file;
                }
            }
            else
            {
                this.pbIcon.Image = Resources.file;
            }
            this.lblName.Text = ftpListItem.Name;
        }

        private void FtpElementControl_Load(object sender, EventArgs e)
        {

        }

        /// <summary>
        /// 子菜單下載功能
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void menu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            this.DownLoadClick?.Invoke(ftpListItem);
        }

        /// <summary>
        /// 雙擊打開
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pbIcon_DoubleClick(object sender, EventArgs e)
        {
            this.SubFolderClick?.Invoke(ftpListItem);
        }
    }
}

主頁面由一系列用戶操作框和按鈕組成,完成對(duì)FTP的基本操作,如下所示:

using FluentFTP;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DemoFtp
{
    public partial class MainForm : Form
    {
        private FtpHelper ftpHelper;

        public MainForm()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            var url = txtFtpUrl.Text;
            var userName = txtUserName.Text;
            var password = txtPassword.Text;
            var port = txtPort.Text;
            if (this.lblRelatePath.Text != "/")
            {
                this.lblRelatePath.Text = "/";
            }
            var relatePath = this.lblRelatePath.Text;
            if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(port))
            {
                MessageBox.Show("路徑和賬號(hào)密碼不可為空");
                return;
            }
            if (ftpHelper == null)
            {
                ftpHelper = new FtpHelper(url, int.Parse(port), userName, password, relatePath);

            }
            ListDir();
        }

        public void SubFolder(FtpListItem ftpListItem)
        {
            if (ftpListItem.Type == FtpObjectType.Directory)
            {
                var fullName = ftpListItem.FullName;
                ftpHelper.RelatePath = fullName;
                ListDir();
                this.lblRelatePath.Text = fullName;
            }
        }


        private void Download(FtpListItem ftpListItem) {
            var fullName=ftpListItem.FullName;
            var fileName = Path.GetFileName(fullName);
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.FileName = fileName;
            sfd.Title = "不載";
            sfd.Filter = "所有文檔|*.*";
            if (DialogResult.OK == sfd.ShowDialog()) {
                ftpHelper.DownloadFile(sfd.FileName, fullName);
            }
        }

        private void ListDir()
        {
            this.ftpContainer.Controls.Clear();
            var ftpListItems = this.ftpHelper.ListDir();
            if (ftpListItems != null && ftpListItems.Length > 0)
            {
                foreach (var ftpListItem in ftpListItems)
                {
                    FtpElementControl ftpControl = new FtpElementControl(ftpListItem);
                    ftpControl.InitControl();
                    ftpControl.DownLoadClick += Download;
                    ftpControl.SubFolderClick += SubFolder;
                    this.ftpContainer.Controls.Add(ftpControl);
                }
            }
        }

        private void btnUpload_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "所有文件|*.*";
            ofd.Title = "請(qǐng)選擇需要上傳的文件";
            if (DialogResult.OK == ofd.ShowDialog()) {
                var localFile=ofd.FileName;
                ftpHelper.UpLoad(this.lblRelatePath.Text, localFile, out bool isOk);
                if (isOk) {
                    ListDir();
                }
            }
        }

        private void pbReturn_Click(object sender, EventArgs e)
        {
            var relativePath=this.lblRelatePath.Text;
            if (relativePath == "/") {
                return;
            }
            relativePath = relativePath.Substring(0, relativePath.LastIndexOf("/")+1);
            ftpHelper.RelatePath=relativePath;
            ListDir();
            this.lblRelatePath.Text = relativePath;
        }
    }
}

以上就是C#利用FluentFTP實(shí)現(xiàn)FTP上傳下載功能詳解的詳細(xì)內(nèi)容,更多關(guān)于C# FTP上傳下載的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 重溫C# clr 筆記總結(jié)

    重溫C# clr 筆記總結(jié)

    本篇文章是對(duì)以前學(xué)習(xí)C# clr做的一些筆記,現(xiàn)在拿出來和大家分享下,希望需要的朋友能參考一下
    2013-05-05
  • C#實(shí)現(xiàn)多文件打包壓縮(.Net?Core)

    C#實(shí)現(xiàn)多文件打包壓縮(.Net?Core)

    本文詳細(xì)講解了.Net?Core框架下C#實(shí)現(xiàn)多文件打包壓縮的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 基于C#實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的HTTP服務(wù)器實(shí)例

    基于C#實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的HTTP服務(wù)器實(shí)例

    這篇文章主要介紹了基于C#實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的HTTP服務(wù)器的方法,詳細(xì)分析了http服務(wù)器的實(shí)現(xiàn)原理與相關(guān)技巧,以及對(duì)應(yīng)的注意事項(xiàng),需要的朋友可以參考下
    2014-12-12
  • c#如何用好垃圾回收機(jī)制GC

    c#如何用好垃圾回收機(jī)制GC

    這篇文章主要介紹了c# 如何用好垃圾回收機(jī)制GC,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2020-08-08
  • c# 可選參數(shù)、命名參數(shù)

    c# 可選參數(shù)、命名參數(shù)

    設(shè)計(jì)一個(gè)方法的參數(shù)的時(shí),可為部分或全部參數(shù)分配默認(rèn)值。調(diào)用其方法時(shí),可以重新指定分配了默認(rèn)值的參數(shù),也可以使用默認(rèn)值
    2012-10-10
  • C#中List.Contains(T)失效的解決方法

    C#中List.Contains(T)失效的解決方法

    這篇文章主要介紹了C#中List.Contains(T)失效的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • C#基于百度AI實(shí)現(xiàn)機(jī)器翻譯功能

    C#基于百度AI實(shí)現(xiàn)機(jī)器翻譯功能

    眾所周知,基于百度ai開發(fā)平臺(tái)我們可以實(shí)現(xiàn)了人臉識(shí)別、文字識(shí)別 、語音識(shí)別等功能。本文將介紹它的另一個(gè)功能,即實(shí)現(xiàn)機(jī)器翻譯,感興趣的可以了解一下
    2022-01-01
  • WCF分布式開發(fā)之MSMQ消息隊(duì)列

    WCF分布式開發(fā)之MSMQ消息隊(duì)列

    這篇文章介紹了WCF分布式開發(fā)之MSMQ消息隊(duì)列,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C# 數(shù)據(jù)庫鏈接字符串加密解密工具代碼詳解

    C# 數(shù)據(jù)庫鏈接字符串加密解密工具代碼詳解

    本文通過代碼給大家介紹C# 數(shù)據(jù)庫鏈接字符串加密解密工具的相關(guān)知識(shí),實(shí)現(xiàn)思路大概是使用兩個(gè)數(shù)對(duì)連接字符串進(jìn)行加密,再用這兩個(gè)數(shù)進(jìn)行解密,具體詳細(xì)代碼,大家參考下本文
    2018-05-05
  • C#利用iTextSharp添加PDF水印

    C#利用iTextSharp添加PDF水印

    這篇文章主要為大家詳細(xì)介紹了C#利用iTextSharp添加PDF水印的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03

最新評(píng)論