最新要闻
- 天天通讯!NBA中国与蚂蚁集团开启全面战略合作:支付宝能看球了!
- 比亚迪百万级超跑 仰望U9路试谍照首次曝光:变好看了
- 环球播报:特斯拉中国工厂提速:2023新款Model 3来了 内饰大升级
- 每日热门:爱奇艺修改会员投屏限制后:优酷腾讯尚未跟进 默不作声
- 快资讯:全球首款!努比亚Pad 3D内置AI引擎:实现全场景3D应用
- 每日资讯:抢在EOS R1前发布:佳能EOS R5 Mark II或将第二季度亮相
- 快讯:张小泉菜刀拍蒜断成两截被吐槽 厂家回应:硬度越大越脆
- 热效率44.26%!吉利新雷神电混发动机量产下线:终于换4缸了
- 热点!咽字组词_咽的组词有哪些
- 欢喜来逗阵结局谁和谁一起了?欢喜来逗阵演员名单
- 翡翠玉镯戴久了有什么变化?翡翠玉镯怎么样辨别真假?
- 青铜时代是哪个朝代?青铜时代介绍
- 难念的经是哪个电视剧主题曲?难念的经粤语谐音歌词
- 电视剧小爸爸插曲有哪几个?电视剧小爸爸插曲大全
- 女生熬夜打游戏角膜上皮脱落!医生称严重需手术换角膜:一定要控制
- 今日要闻!后路堵死!苹果关闭iOS 16.3验证通道
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
世界播报:C# 利用FluentFTP实现FTP上传下载功能
FTP作为日常工作学习中,非常重要的一个文件传输存储空间,想必大家都非常的熟悉了,那么如何快速的实现文件的上传下载功能呢,本文以一个简单的小例子,简述如何通过FluentFTP实现文件的上传和下载功能。仅供学习分享使用,如有不足之处,还请指正。
FTP基础知识
文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。FTP允许用户以文件操作的方式(如文件的增、删、改、查、传送等)与另一主机相互通信。然而, 用户并不真正登录到自己想要存取的计算机上面而成为完全用户, 可用FTP程序访问远程资源, 实现用户往返传输文件、目录管理以及访问电子邮件等等, 即使双方计算机可能配有不同的操作系统和文件存储方式。
(相关资料图)
FTP环境搭建
在windows操作系统中,FTP可以通过(Internet Inforamtion Services, IIS)管理器进行创建,创建成功后即可进行查看,如下所示:
FluentFTP安装
FluentFTP是一款基于.Net的FTP和FTPS的客户端动态库,操作简单便捷。
首先创建基于.Net Framework 4.6.1的winform应用程序,然后通过Nuget包管理器进行安装,如下所示:
示例演示
主要实现基于FTP的上传,下载,浏览等功能,如下所示:
进入文件夹及右键下载,如下所示:
示例源码
FtpHelper类源码,封装了FTP文件的检索,上传,下载等功能,如下所示:
1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Net; 6 using System.Text; 7 using System.Threading; 8 using System.Threading.Tasks; 9 using FluentFTP; 10 11 namespace DemoFtp 12 { 13 public class FtpHelper 14 { 15 #region 属性与构造函数 16 17 ///18 /// IP地址 19 /// 20 public string IpAddr { get; set; } 21 22 ///23 /// 相对路径 24 /// 25 public string RelatePath { get; set; } 26 27 ///28 /// 端口号 29 /// 30 public int Port { get; set; } 31 32 ///33 /// 用户名 34 /// 35 public string UserName { get; set; } 36 37 ///38 /// 密码 39 /// 40 public string Password { get; set; } 41 42 public FtpHelper() 43 { 44 45 } 46 47 public FtpHelper(string ipAddr, int port, string userName, string password, string relatePath) 48 { 49 this.IpAddr = ipAddr; 50 this.Port = port; 51 this.UserName = userName; 52 this.Password = password; 53 this.RelatePath = relatePath; 54 } 55 56 #endregion 57 58 #region 方法 59 60 public FtpListItem[] ListDir() { 61 FtpListItem[] lists; 62 using (var ftpClient = new FtpClient(this.IpAddr, this.UserName, this.Password, this.Port)) 63 { 64 ftpClient.Connect(); 65 ftpClient.SetWorkingDirectory(this.RelatePath); 66 lists = ftpClient.GetListing(); 67 } 68 return lists; 69 } 70 71 public void UpLoad(string dir, string file, out bool isOk) 72 { 73 isOk = false; 74 FileInfo fi = new FileInfo(file); 75 using (FileStream fs = fi.OpenRead()) 76 { 77 //long length = fs.Length; 78 using (var ftpClient = new FtpClient(this.IpAddr, this.UserName, this.Password, this.Port)) 79 { 80 ftpClient.Connect(); 81 ftpClient.SetWorkingDirectory(this.RelatePath); 82 string remotePath = dir + "/" + Path.GetFileName(file); 83 var ftpRemodeExistsMode = file.EndsWith(".txt") ? FtpRemoteExists.Overwrite : FtpRemoteExists.Skip; 84 FtpStatus status = ftpClient.UploadStream(fs, remotePath, ftpRemodeExistsMode, true); 85 isOk = status == FtpStatus.Success; 86 87 } 88 } 89 90 } 91 92 ///93 /// 上传多个文件 94 /// 95 /// 96 /// 97 public void UpLoad(string dir, string[] files, out bool isOk) 98 { 99 isOk = false;100 if (CheckDirIsExists(dir))101 {102 foreach (var file in files)103 {104 UpLoad(dir, file, out isOk);105 }106 }107 }108 109 110 private bool CheckDirIsExists(string dir)111 {112 bool flag = false;113 using (var ftpClient = new FtpClient(this.IpAddr, this.UserName, this.Password, this.Port))114 {115 ftpClient.Connect();116 ftpClient.SetWorkingDirectory(this.RelatePath);117 flag = ftpClient.DirectoryExists(dir);118 if (!flag)119 {120 flag = ftpClient.CreateDirectory(dir);121 }122 }123 return flag;124 125 126 }127 128 ///129 /// 下载ftp 130 /// 131 /// 132 /// 133 ///134 public bool DownloadFile(string localAddress, string remoteAddress)135 {136 using (var ftpClient = new FtpClient(this.IpAddr, this.UserName, this.Password, this.Port))137 {138 ftpClient.SetWorkingDirectory("/");139 ftpClient.Connect();140 if (ftpClient.DownloadFile(localAddress, remoteAddress) == FtpStatus.Success)141 {142 return true;143 }144 return false;145 }146 }147 148 #endregion149 }150 }
每一个FTP文件或文件夹,由一个自定义用户控件【PictureBox+Label+ContextMenu】表示,这样便于处理与显示:
1 using DemoFtp.Properties; 2 using FluentFTP; 3 using System; 4 using System.Collections.Generic; 5 using System.ComponentModel; 6 using System.Data; 7 using System.Drawing; 8 using System.IO; 9 using System.Linq;10 using System.Text;11 using System.Threading.Tasks;12 using System.Windows.Forms;13 14 namespace DemoFtp15 {16 public partial class FtpElementControl : UserControl17 {18 public ActionSubFolderClick;19 20 public Action DownLoadClick;21 22 private FtpListItem ftpListItem;23 24 public FtpElementControl(FtpListItem ftpListItem)25 {26 InitializeComponent();27 this.ftpListItem = ftpListItem;28 }29 30 public FtpElementControl()31 {32 InitializeComponent();33 }34 35 public void InitControl()36 {37 if (ftpListItem.Type == FtpObjectType.Directory)38 {39 this.pbIcon.Image = Resources.folder.ToBitmap();40 }41 else if (ftpListItem.Type == FtpObjectType.File)42 {43 var name = ftpListItem.Name;44 var ext = Path.GetExtension(name).ToLower().Substring(1);45 if (ext == "png" || ext == "jpeg" || ext == "jpg" || ext == "bmp" || ext == "gif")46 {47 this.pbIcon.Image = Resources.pictures.ToBitmap();48 }49 else if (ext == "doc" || ext == "docx")50 {51 this.pbIcon.Image = Resources.doc.ToBitmap();52 }53 else if (ext == "exe")54 {55 this.pbIcon.Image = Resources.setup.ToBitmap();56 }57 else58 {59 this.pbIcon.Image = Resources.file;60 }61 }62 else63 {64 this.pbIcon.Image = Resources.file;65 }66 this.lblName.Text = ftpListItem.Name;67 }68 69 private void FtpElementControl_Load(object sender, EventArgs e)70 {71 72 }73 74 /// 75 /// 子菜单下载功能76 /// 77 /// 78 /// 79 private void menu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)80 {81 this.DownLoadClick?.Invoke(ftpListItem);82 }83 84 ///85 /// 双击打开86 /// 87 /// 88 /// 89 private void pbIcon_DoubleClick(object sender, EventArgs e)90 {91 this.SubFolderClick?.Invoke(ftpListItem);92 }93 }94 }
主页面由一系列用户操作框和按钮组成,完成对FTP的基本操作,如下所示:
1 using FluentFTP; 2 using System; 3 using System.Collections.Generic; 4 using System.ComponentModel; 5 using System.Data; 6 using System.Drawing; 7 using System.IO; 8 using System.Linq; 9 using System.Text; 10 using System.Threading.Tasks; 11 using System.Windows.Forms; 12 13 namespace DemoFtp 14 { 15 public partial class MainForm : Form 16 { 17 private FtpHelper ftpHelper; 18 19 public MainForm() 20 { 21 InitializeComponent(); 22 } 23 24 private void btnLogin_Click(object sender, EventArgs e) 25 { 26 var url = txtFtpUrl.Text; 27 var userName = txtUserName.Text; 28 var password = txtPassword.Text; 29 var port = txtPort.Text; 30 if (this.lblRelatePath.Text != "/") 31 { 32 this.lblRelatePath.Text = "/"; 33 } 34 var relatePath = this.lblRelatePath.Text; 35 if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(port)) 36 { 37 MessageBox.Show("路径和账号密码不可为空"); 38 return; 39 } 40 if (ftpHelper == null) 41 { 42 ftpHelper = new FtpHelper(url, int.Parse(port), userName, password, relatePath); 43 44 } 45 ListDir(); 46 } 47 48 public void SubFolder(FtpListItem ftpListItem) 49 { 50 if (ftpListItem.Type == FtpObjectType.Directory) 51 { 52 var fullName = ftpListItem.FullName; 53 ftpHelper.RelatePath = fullName; 54 ListDir(); 55 this.lblRelatePath.Text = fullName; 56 } 57 } 58 59 60 private void Download(FtpListItem ftpListItem) { 61 var fullName=ftpListItem.FullName; 62 var fileName = Path.GetFileName(fullName); 63 SaveFileDialog sfd = new SaveFileDialog(); 64 sfd.FileName = fileName; 65 sfd.Title = "不载"; 66 sfd.Filter = "所有文档|*.*"; 67 if (DialogResult.OK == sfd.ShowDialog()) { 68 ftpHelper.DownloadFile(sfd.FileName, fullName); 69 } 70 } 71 72 private void ListDir() 73 { 74 this.ftpContainer.Controls.Clear(); 75 var ftpListItems = this.ftpHelper.ListDir(); 76 if (ftpListItems != null && ftpListItems.Length > 0) 77 { 78 foreach (var ftpListItem in ftpListItems) 79 { 80 FtpElementControl ftpControl = new FtpElementControl(ftpListItem); 81 ftpControl.InitControl(); 82 ftpControl.DownLoadClick += Download; 83 ftpControl.SubFolderClick += SubFolder; 84 this.ftpContainer.Controls.Add(ftpControl); 85 } 86 } 87 } 88 89 private void btnUpload_Click(object sender, EventArgs e) 90 { 91 OpenFileDialog ofd = new OpenFileDialog(); 92 ofd.Filter = "所有文件|*.*"; 93 ofd.Title = "请选择需要上传的文件"; 94 if (DialogResult.OK == ofd.ShowDialog()) { 95 var localFile=ofd.FileName; 96 ftpHelper.UpLoad(this.lblRelatePath.Text, localFile, out bool isOk); 97 if (isOk) { 98 ListDir(); 99 }100 }101 }102 103 private void pbReturn_Click(object sender, EventArgs e)104 {105 var relativePath=this.lblRelatePath.Text;106 if (relativePath == "/") {107 return;108 }109 relativePath = relativePath.Substring(0, relativePath.LastIndexOf("/")+1);110 ftpHelper.RelatePath=relativePath;111 ListDir();112 this.lblRelatePath.Text = relativePath;113 }114 }115 }
以上就是基于FluentFTP实现FTP上传下载的全部内容,旨在抛砖引玉,共同学习,一起进步。
世界播报:C# 利用FluentFTP实现FTP上传下载功能
天天通讯!NBA中国与蚂蚁集团开启全面战略合作:支付宝能看球了!
比亚迪百万级超跑 仰望U9路试谍照首次曝光:变好看了
环球播报:特斯拉中国工厂提速:2023新款Model 3来了 内饰大升级
每日精选:云业务成本的组成与管理趋势
世界快消息!火山引擎数智平台ByteHouse入围稀土掘金《Top10 年度创新产品》
天天快资讯丨前端开发页面性能优化法则
每日热门:爱奇艺修改会员投屏限制后:优酷腾讯尚未跟进 默不作声
快资讯:全球首款!努比亚Pad 3D内置AI引擎:实现全场景3D应用
每日资讯:抢在EOS R1前发布:佳能EOS R5 Mark II或将第二季度亮相
快讯:张小泉菜刀拍蒜断成两截被吐槽 厂家回应:硬度越大越脆
热效率44.26%!吉利新雷神电混发动机量产下线:终于换4缸了
热点!咽字组词_咽的组词有哪些
欢喜来逗阵结局谁和谁一起了?欢喜来逗阵演员名单
翡翠玉镯戴久了有什么变化?翡翠玉镯怎么样辨别真假?
青铜时代是哪个朝代?青铜时代介绍
【天天播资讯】一台不容错过的Java单元测试代码“永动机”
全球动态:火爆全球的ChatGPT是什么?
环球要闻:数据结构刷题2023.02.21小记
若依框架的MVC各层功能解释
全球观速讯丨借力英特尔® Smart Edge,灵雀云 ACP 5G 专网解决方案获得多维度优化加速
难念的经是哪个电视剧主题曲?难念的经粤语谐音歌词
电视剧小爸爸插曲有哪几个?电视剧小爸爸插曲大全
三星4521打印机怎么连接手机?三星4521打印机卡纸怎么拿出来?
SBSetting怎么打开?sbsettings怎么安装到手机?
万能遥控器怎么使用?万能遥控器怎么配对机顶盒?
三星G810上市价格是多少?三星G810手机参数
数字电视遥控器怎么配对?数字电视遥控器没反应怎么办?
女生熬夜打游戏角膜上皮脱落!医生称严重需手术换角膜:一定要控制
今日要闻!后路堵死!苹果关闭iOS 16.3验证通道
洁癖福音!通用汽车申请自清洁触摸屏新专利:可自动清除屏幕指纹
36个月超长质保行业天花板!魅族20系列超前预订来了:只要1元
2023新年反思、总结、规划
SLA探活工具EaseProbe简介
天天快消息!二步法免疫组化试剂盒的详细介绍
世界视讯!每年分红不低于净利润一半!格力宣布将发56亿现金分红
热门看点:土耳其再发生6.4级地震 现场视频曝光:地动山摇
爱奇艺恢复会员投屏!“限制投屏案”原告:集体发声的结果
周鸿祎:比尔盖茨低估了ChatGPT的价值
当前播报:日本游客不舍告别 旅日大熊猫“香香”今天回家了!下午飞抵成都
当前动态:ETL的架构设计和实现及其优势
K8S-namespace 六大类型
信息:原来建造者模式是这样用的
环球看点!买部iPhone 14要花你多少年薪?各国对比:国人要12% 印度近50%
环球焦点!山东人坐地铁不拉手环直接抓杆引围观:人均身高1米8名不虚传
12岁女孩玩手游充值近3万 父亲要求退被拒:网友热议不该退 家长原因
中秋节的儿童画怎么画_中秋节的儿童画怎么画简单的
今天二月二龙抬头!四六级、考研初试今起可查分 方法来了
天天百事通!一加11概念机官宣:背部蓝色灯带抢眼 极具辨识度
每日消息!读Java实战(第二版)笔记16_组合式异步编程
天天热文:小米13系列本周MWC 2023发布!卢伟冰:海外米粉翘首以盼
你怎么看?日本66%的高端外国人才是中国人:远超印度、韩国
热门:kubernetes二进制部署(单节点)
环球速看:MyBatis plus 代码生成器
【世界聚看点】CSS概念与CSS选择器
环球观天下!NVIDIA为游戏玩家做了哪些贡献?DLSS、光追等4项技术还真少不了
世界观点:残忍没法看!大白鲨罕见"斩首"潜水员 2023年第一例鲨鱼吃人
27岁身高186cm的研究生 想捐精被拒:因为要不了那么多
【环球热闻】真服了 到底是谁还在支付宝里种树啊?
环球观天下!比亚迪立功 磷酸铁锂电芯份额暴增至67.5% 三元锂被甩远
世界热推荐:曲艺杂谈歌曲_曲艺杂谈
天天速递!vue-cli创建前端项目以及前后端交互
世界微动态丨记录一次HAWQ手工启动
当前快讯:教育部寒假促就业“暖心行动”超9100家用人单位参加 提供岗位信息超49.1万条
全球今亮点!射击游戏大作《原子之心》8分好评 继承《生化奇兵》的遗志
【世界播资讯】三步实现在ASP.NET Core Web API集成ChatGPT
环球即时:弯道超车 中国动力电池企业 “狂飙”入欧
全球快消息!i9-13900H+RTX 4060满血加持!华硕天选4酷睿版图赏
AMD不赞同NVIDIA:游戏卡加太多AI徒增成本 玩家买单
环球关注:AtCoder Beginner Contest 289
当前看点!女子因宠物猫去世欲轻生 网友吵翻:猫是“家人”为何不可?
4799元 小米Redmi Book Pro15增强版上架:8核升级12核
6.1英寸小屏手感绝佳!三星Galaxy S23图赏
环球快报:肯德基麦当劳的汉堡越卖越小引热议:20年基本没涨价真良心?
焦点滚动:02月20日20时山东滨州昨日累计报告阳性感染者确诊250例 怎么判断自己是否属于轻型感染者
火山引擎 DataTester:在广告投放场景下的 A/B 实验实践
第120篇: DOM编程(常用操作、动态脚本、样式及动态表格)
世界讯息:可孚医用N95口罩30只装 灭菌独立包装19.9元大促
男子因缺钙CT图像中没有肋骨:“像一个透明人”
全球新消息丨189元 OPPO Enco Air3无线耳机上架:HiFi 5 DSP、支持蓝牙5.3
腾讯XR业务转向:或将合作引进Quest 2头显
闲鱼上买显示器靠谱吗?注意这几点就可以
世界要闻:物联网平台选型葵花宝典:盘点开源、SaaS及通用型平台的优劣对比
【Unity AR】
AR精灵制作学习记录 【天天快播报】项目开发软件架构选择指南
飞利浦推出两款44.5英寸带鱼屏:1500R大曲率、75Hz刷新率
行驶中小车后备箱塞人露双脚!司机称其喝醉了:遭网友谴责
世界播报:低头族注意了!9岁女孩长期低头颈椎老如50岁
领1030元大额券:骆驼户外徒步鞋179元起大促
世界观点:亚马逊要求员工一周到岗工作3天:公司一度像个鬼城
K8S-deployment.yaml文件详解
开心档-Git 基本操作
资讯推荐:制造业做信息化(IT管理、程序员)有前途吗?---浅谈信息系统规划
全球观点:记录--什么时候会阻塞HTML文档渲染过程?
【Oculus Interaction SDK】(十一)关于手势识别中手势设置的详细信息
天天热资讯!埃塞俄比亚政府和“提人阵”武装达成停火协议
天天新消息丨义乌自己的全球支付工具!义支付发布:打通16个币种
这待遇简直了!美团外卖进军香港 正疯狂招骑手:月入3万+
消息!手机套餐费太贵 韩国三大运营商被批:是否串通涨价
与剧版强烈反差!《三体》动画豆瓣跌至3.9分:官方已停播