当前位置: 首页 > 编程日记 > 正文

网络编程--ftp客户端的实现(c#版)

.net2.0对ftp有了一个很好的封装,但是确容易让人忽略ftp的真正内部实现,下面是我实现的ftp客户端的功能,其主要步骤是这样的:
1、创建一个FtpWebRequest对象,指向ftp服务器的uri
  2、设置ftp的执行方法(上传,下载等)
  3、给FtpWebRequest对象设置属性(是否支持ssl,是否使用二进制传输等)
  4、设置登录验证(用户名,密码)
  5、执行请求
  6、接收相应流(如果需要的话)
  7、如果没有打开的流,则关闭ftp请求
  
  开发任何ftp应用程序都需要一个相关的ftp服务器及它的配置信息。FtpWebRequest暴露了一些属性来设置这些信息。
首先是连接然后取出ftp中所有的目录和文件列表显示
  Cursor currentCursor = this.Cursor;
            FtpWebResponse respons 
= null;
            Stream stream 
= null;
            
try
            
{
                
this.Cursor = Cursors.WaitCursor;
                FtpWebRequest request 
= (FtpWebRequest)WebRequest.Create(textBox1.Text);
                request.Credentials 
= new NetworkCredential(textName.Text, textPwd.Text);
                request.Method 
= WebRequestMethods.Ftp.ListDirectory;
                respons 
= (FtpWebResponse)request.GetResponse();
                stream 
= respons.GetResponseStream();
                FillDirectoryList(stream);
                serverDirecftory 
= null;

            }

            
catch (Exception ex)
            
{
                MessageBox.Show(ex.Message, 
"error Ftp Client", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }

            
finally
            
{
                
if (respons != null)
                    respons.Close();
                
if (stream != null)
                    stream.Close();
                
this.Cursor = currentCursor;
            }


        }

打开一个目录:
 FtpWebResponse response = null;
            Stream stream 
= null;
            
try
            
{
                
string subDir = listBox1.SelectedValue.ToString().Trim();
                serverDirecftory 
+= "/" + subDir;
                Uri baseUri 
= new Uri(textBox1.Text);
                Uri uri 
= new Uri(baseUri, serverDirecftory);
                FtpWebRequest request 
= (FtpWebRequest)WebRequest.Create(uri);
                request.Credentials 
= new NetworkCredential(textName.Text, textPwd.Text);
                request.Method 
= WebRequestMethods.Ftp.ListDirectory;
                response 
= (FtpWebResponse)request.GetResponse(); stream = response.GetResponseStream();
                FillDirectoryList(stream);
                
//serverDirecftory = null;

            }

            
catch (Exception ex)
            
{
                MessageBox.Show(ex.Message, 
"error Ftp Client", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }

            
finally
            
{
                
if (response != null)
                    response.Close();
                
if (stream != null)
                    stream.Close();
            }

上传功能
private void Upload(string filename) 
  

   FileInfo fileInf 
= new FileInfo(filename); 
   
string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name; 
   FtpWebRequest reqFTP; 
   
   
// 根据uri创建FtpWebRequest对象 
   reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fileInf.Name)); 
   
   
// ftp用户名和密码 
   reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 
   
   
// 默认为true,连接不会被关闭 
   
// 在一个命令之后被执行 
   reqFTP.KeepAlive = false
   
   
// 指定执行什么命令 
   reqFTP.Method = WebRequestMethods.Ftp.UploadFile; 
   
   
// 指定数据传输类型 
   reqFTP.UseBinary = true
   
   
// 上传文件时通知服务器文件的大小 
   reqFTP.ContentLength = fileInf.Length; 
   
   
// 缓冲大小设置为2kb 
   int buffLength = 2048
   
   
byte[] buff = new byte[buffLength]; 
   
int contentLen; 
   
   
// 打开一个文件流 (System.IO.FileStream) 去读上传的文件 
   FileStream fs = fileInf.OpenRead(); 
   
try 
   

   
// 把上传的文件写入流 
   Stream strm = reqFTP.GetRequestStream(); 
   
   
// 每次读文件流的2kb 
   contentLen = fs.Read(buff, 0, buffLength); 
   
   
// 流内容没有结束 
   while (contentLen != 0
   

   
// 把内容从file stream 写入 upload stream 
   strm.Write(buff, 0, contentLen); 
   
   contentLen 
= fs.Read(buff, 0, buffLength); 
   }
 
   
   
// 关闭两个流 
   strm.Close(); 
   fs.Close(); 
   }
 
   
catch (Exception ex) 
   

   MessageBox.Show(ex.Message, 
"Upload Error"); 
   }
 
  }
 

写到这可能有些明白了,我们发现不管是显示,上传还是转到下级,他们的方法都是一致的即我们开头说的几步,重点是设置当前的路径所在,我在这了用了一个全局变量string serverDirecftory来存储,当时根目录的我们就设置为NULL,当目录由变化时我们改变其值就行了,如下一个目录中  serverDirecftory += "/" + subDir;同时设置要执行的命令这是关键:
 request.Method = WebRequestMethods.Ftp.ListDirectory(Rename,Delete,GetFileSize,FileListDetails,MakeDir);
这样 我们就可以实现ftp客户端的整个功能了。

转载于:https://www.cnblogs.com/hya1109/archive/2008/05/25/1207054.html

相关文章:

Windows客户端C/C++编程规范“建议”——文件

7 文件 7.1 正确使用#include 等级&#xff1a;【推荐】 说明&#xff1a;#include <>和#include “”导致编译器在搜索文件时&#xff0c;搜索的路径顺序不同。所以需要正确使用#include&#xff0c;以避免包含错了头文件。 语法形式操作带引号的形式预处理器按以下…

让你的网站支持 Emoji

SegmentFault有用户提出要支持Emoji表情输入&#xff0c;就研究了一下&#xff1a; 要记得备份数据库。 首先Mysql数据库在5.5.3之后开始支持utf8mb4字符集&#xff0c;所以mysql版本是5.5.3&#xff0b;的都可以设置让数据库存储Emoji表情&#xff0c;如果你的应用有移动端的&…

Windows客户端C/C++编程规范“建议”——变量和常量

8 变量和常量 8.1 尽量不要使用全局变量 等级&#xff1a; 【要求】说明&#xff1a;全局变量的滥用和goto的滥用一样&#xff0c;都是一种灾难。它将使得逻辑变得难以调试和控制。8.2 不涉及外部使用的全局变量需要使用static关键字修饰 等级&#xff1a; 【要求】说明&#…

机器学习模型五花八门不知道怎么选?这份指南告诉你

作者 | LAVANYA译者 | 陆离编辑 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】在本文中&#xff0c;我们将探讨不同的机器学习模型&#xff0c;以及每个模型合理的使用场景。一般来说&#xff0c;基于树形结构的模型在Kaggle竞赛中是表现最好的&…

WinAPI: FlattenPath、WidenPath

不管什么曲线命令, 到来路径中都会变成 Bezier 线; 也就是说路径中只有直线和 Bezier 线.FlattenPath 和 WidenPath 都能够把路径中的 Bezier 线转换为近似的直线; 不同的是: 用 WidenPath 转换后貌似加宽了线, 其实它是转换成了一个包围路径的新路径(类似区域).本例效果图:代码…

Android - 小的特点 - 使用最新版本ShareSDK手册分享(分享自己定义的接口)

前太实用Share SDK很快分享&#xff0c;但官员demo快捷共享接口已被设置死&#xff0c;该公司的产品还设计了自己的份额接口&#xff0c;这需要我手动共享。 读了一堆公文&#xff0c;最终写出来&#xff0c;行&#xff0c;废话&#xff0c;进入主题。 之前没实用过ShareSDK分享…

结合Flink,国内自研,大规模实时动态认知图谱平台——AbutionGraph |博文精选

作者 | Raini出品 | 北京图特摩斯科技 &#xff08;www.thutmose.cn&#xff09;(*点击阅读原文&#xff0c;查看作者更多精彩文章&#xff09;Flink&#xff1a;目前最受关注的大数据技术&#xff0c;最活跃 Apache 项目之一。AbutionGraph&#xff1a;北京图特摩斯科技自研的…

Windows客户端C/C++编程规范“建议”——风格

9 风格 9.1 优先使用匈牙利命名法 等级&#xff1a; 【推荐】说明&#xff1a;该方法由微软总设计师设计。Windows上编程最好遵从该标准。详细介绍见&#xff1a;http://zh.wikipedia.org/wiki/%E5%8C%88%E7%89%99%E5%88%A9%E5%91%BD%E5%90%8D%E6%B3%959.2 变量名结合使用匈牙…

使用GIF(仅限Delphi2007)

-----------uses GIFImg; procedure TForm1.FormCreate(Sender: TObject); begin // 先在窗体上放一个 TImage 组件&#xff1a;Image1&#xff1b; Image1.Picture.LoadFromFile(C:\Example.gif); // AnimationSpeed 设定动画速度&#xff0c;值越大&#xff0c;速度越快…

使用Depth Texture

使用Depth Textures&#xff1a;   可以将depth信息渲染到一张texture&#xff0c;有些效果的制作会需要scene depth信息&#xff0c;此时depth texture就可以派上用场了。   Depth Texture在不同平台上有不同的实现&#xff0c;并且原生的支持也不一样。   UnityCG.cgin…

Exchage 2007 Client Application Functions(2) -- 如何收取邮件

上一篇介绍的Exchange2007客户端程序中怎么发送邮件。现在&#xff0c;我来简单介绍一下怎么收取邮件。来看代码&#xff1a;publicHashtable GetAllMails(DateTime StartDate, DateTime EndDate) { try { if (null this.m_esb) …

VC开发Windows客户端软件之旅——前言

从第一次拖着行李入京找活&#xff0c;至今已工作若干年了。这些年一直追逐自己的梦想&#xff0c;跑过三个城市&#xff0c;换了三份工作&#xff0c;认识了很多业内的朋友。和朋友们闲聊时&#xff0c;发现很多人都已经不再做客户端软件了。有的转去做管理&#xff0c;有的转…

代替Mask R-CNN,BlendMask欲做实例预测任务的新基准?

「免费学习 60 节公开课&#xff1a;投票页面&#xff0c;点击讲师头像」作者 | Hao Chen、Kunyang Sun、Zhi Tian、Chunhua Shen、Yongming Huang、Youliang Yan译者 | 刘畅编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】实例分割是…

如何让ie 7 支持box-shadow

box-shadow是一个很好用并且也常用的css 3属性&#xff0c;但是&#xff0c;如果我们要保证它能在ie 8及更低的版本下运行的话&#xff0c;需要借助一些其他的插件或文件。在这里我主要讲一下&#xff0c;如何用PIE.htc来解决ie 7不支持box-shadow。 代码如下&#xff1a; <…

拥有AI「变声术」,秒杀了多年苦练的模仿艺能

「免费学习 60 节公开课&#xff1a;投票页面&#xff0c;点击讲师头像」作者 | Daniel Chen&#xff0c;爱奇艺资深研发工程师 出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】什么是Voice Conversion&#xff08;VC&#xff09;&#xff1f;它有…

服务器架设笔记——编译Apache及其插件

之前一直从事Windows上的客户端软件开发&#xff0c;经常会处理和服务器交互相关的业务。由于希望成为一个全栈式的工程师&#xff0c;我对Linux上服务器相关的开发也越来越感兴趣。趁着年底自由的时间比较多&#xff0c;我可以对这块做些技术研究。虽然这些知识很基础也很老&a…

Silverlight 2中多语言支持实现(上)

引言 最近项目要在Silverlight 2应用程序中实现本地化&#xff0c;原以为这个过程非常简单&#xff0c;却没想到实现的时候一波三折&#xff0c;好在结果还算不错。需求是这样的&#xff0c;用户第一次访问的时候&#xff0c;默认为英文&#xff0c;当用户选择一种显示语言后&a…

解析大型.NET ERP系统 多国语言实现

实现多国语言有许多种实现方案&#xff0c;无外乎是一种字符串替换技术&#xff0c;将界面控件的文本标签替换成相应语言的文字。.NET Windows Forms实现多国语言的方法有以下几种&#xff1a; 1 .NET的方案&#xff0c;使用资源文件 分别做三个语言的资源文件&#xff0c;比如…

服务器架设笔记——Apache模块开发基础知识

通过上节的例子&#xff0c;我们发现Apache插件开发的一个门槛便是学习它自成体系的一套API。虽然Apache的官网上有对这些API的详细介绍&#xff0c;但是空拿着一些零散的说明书&#xff0c;是很难快速建立起一套可以运行的系统。&#xff08;转载请指明出于breaksoftware的csd…

解密Elasticsearch技术,腾讯开源的万亿级分布式搜索分析引擎

「免费学习 60 节公开课&#xff1a;投票页面&#xff0c;点击讲师头像」作者 | johngqjiang&#xff0c;腾讯 TEG 云架构平台部研发工程师来源 | 腾讯技术工程&#xff08;ID&#xff1a;Tencent_TEG&#xff09;【导读】Elasticsearch&#xff08;ES&#xff09;作为开源首选…

Centos5上firefox的升级

Centos5上firefox的升级默认Centos5上firefox的版本是1.5当我们使用yum update firefox提示到的版本还是1.5 可是我们在使用1.5版本的firefox可能会有一些问题&#xff0c;比如打不开QQ空间接下来我们就将系统的firefox从rpm包的1.5版本升级到tar包的3.0首先删除1.5版本的fire…

cheat engine lua

function CEButton1Click(sender) local x getProperty(CETrainer.CEEdit1,"Text")--这句很重要,获取文本框的值 --writeInteger(0x42c0c0,readInteger(0x42c0c0)x)--设置0X42C0C0地址的值 setProperty(CETrainer.CEEdit2,"Text","0001000")--设…

服务器架设笔记——使用Apache插件解析简单请求

一般来说&#xff0c;对于一个请求&#xff0c;服务器都会对其进行解析&#xff0c;以确定请求的合法性以及行进的路径。于是本节将讲解如何获取请求的数据。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 我们使用《服务器架设笔记——编译Apache及其插件》…

如何用Python快速抓取Google搜索?

「免费学习 60 节公开课&#xff1a;投票页面&#xff0c;点击讲师头像」作者 | linksc译者 | 弯月&#xff0c;编辑 | 郭芮来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;自从2011年 Google Web Search API 被弃用以来&#xff0c;我一直在寻找其他的方法来抓取G…

利用歌词插件 让WMP活起来

如果利用起这个歌词插件的话 是不是可以减少下载那么多播放器和每次更新的烦恼呢?因为WMP是系统自带的.可以下载的插件名称:Wa3 Music Engine 或者乐辞的歌词秀插件转载于:https://blog.51cto.com/david25/84211

Linux性能研究(总)

http://www.vpsee.com/2009/11/linux-system-performance-monitoring-introduction/ http://www.jb51.net/LINUXjishu/34607.html 公司有个测试服务器&#xff0c;上面跑了几个应用和一个DB。 DB被这个几个应用使用。 最近老是被挂掉。 CPU 使用率100%。 搞到最后大家都不能用。…

万字干货:如何从零开始构建企业级推荐系统?

「免费学习 60 节公开课&#xff1a;投票页面&#xff0c;点击讲师头像」作者丨gongyouliu编辑丨zandy来源 | 大数据与人工智能&#xff08;ID: ai-big-data&#xff09;最近几个月有很多人咨询作者怎么从零开始搭建工业级推荐系统&#xff0c;有做音视频的、有做新闻资讯的、有…

Mocha BSM基础架构管理——灵活的网络拓扑展现

业务需求与挑战企业的网络拓扑结构与设备时常变化&#xff0c;人工往往难以维护网络拓扑。尤其对于上千台设备的大型网络来说情况更为复杂。当用户网络设备大量增加后&#xff0c;网络结构异常复杂&#xff0c;用户的网络拓扑很难在一个屏幕上展现或者很难找到要查阅的网络拓扑…

服务器架设笔记——打通MySQL和Apache

在《服务器架设笔记——使用Apache插件解析简单请求》一文中&#xff0c;我们已经可以获取请求内容。这只是万里长征的第一步。因为一般来说&#xff0c;客户端向服务器发起请求&#xff0c;服务器会有着复杂的业务处理逻辑。举个例子&#xff0c;大部分客户端软件都有日志模块…

【Maven】maven的安装配置和ecplise结合

2. Maven的安装和配置 2.1. 安装 进入Maven官网的下载页面&#xff1a;http://maven.apache.org/download.cgi&#xff0c;如下图所示&#xff1a; 选择当前最新版本&#xff1a;“apache-maven-3.0.4-bin.zip”&#xff0c;下载到本地&#xff0c;解压缩到本地磁盘D:下。 2…