.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

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

  1. 【Python】网络编程--解决粘包问题--简单版:

    网络编程–解决粘包问题–简单版: 客户端: import struct import socketphone=socket.socket(socket.AF_INET,socket.SOCK_STRE ...

  2. python 网络编程_Python网络编程(原书第2版)

    Python网络编程(原书第2版) 作者:(美)埃里克·周(Eric Chou) 著 出版日期:2019年06月 文件大小:54.50M 支持设备: ¥68.00 适用客户端: 言商书局 iPad/i ...

  3. 索骥馆-编程语言之《网络编程实用教程(第2版)》扫描版[PDF]

    内容介绍: 本书主要介绍基于tcp/ip协议栈的套接字网络编程技术.全书分为10章,第1章介绍网络编程基础,第2章介绍套接字网络编程接口,第3章介绍windows环境的网络编程,第4章介绍mfc编程, ...

  4. php网络编程自学手册 pdf,葛丽萍PHP网络编程技术详解 pdf扫描版

    葛丽萍PHP网络编程技术详解 pdf扫描版由软吧下载编辑精心整理,是一本php语言网络编程技术指导手册,由葛丽萍编著.全书内容全面,涵盖PHP网站开发中的八种常用技术,从基础知识到高级技术,再到项目开 ...

  5. Linux网络编程--FTP云盘项目

    FTP云盘 FTP就是文件传输协议.用于互联网双向传输,控制文件下载空间在服务器复制文件从本地计算机或本地上传文件复制到服务器上的空间. server #include <stdio.h> ...

  6. 【Java 网络编程】客户端 Socket 创建

    文章目录 I TCP 无代理或无参构造函数 II 创建 Socket 时指定代理 III 创建 Socket 时直接指定服务器地址和端口号 IV 创建 Socket 时直接指定服务器地址和端口号 并绑 ...

  7. socket网络编程ftp

    #!/usr/bin/env python #-*-coding:utf-8-*- #ftp客户端 import os import socket import threading import so ...

  8. python网络编程——HTTP客户端

    1.Python客户端库. urllib和requests是Python对HTTP协议的应用,使用的两个库.urllib是Python的标准内置库,requests是一个比urllib更强大的第三方库 ...

  9. 【Java 网络编程】客户端 Socket 配置 ( 超时时间 | 端口复用 | Nagle 算法 | 心跳包机制 | 连接关闭机制 | 缓冲区大小 | 性能权重设置 | 紧急数据设置 )

    文章目录 I 设置读取超时时间 II Socket 复用绑定端口设置 III 开启 Nagle 算法 ( 沾包 ) IV 心跳包机制 V 连接关闭处理 VI Socket 紧急数据内敛设置 VII S ...

最新文章

  1. Linux赋予普通用户root权限
  2. CVE-2019-8341 Jinja2 RCE漏洞学习
  3. 第十七章 特殊成员_类的函数指针
  4. 最新完整版PHP配置文件翻译
  5. pcb设计单点接地示意图_答案:关于PCB 的EMC设计知识考卷
  6. 阿里云高级技术专家张毅萍:我眼中的边缘计算
  7. visual studio 让代码看起来更舒服
  8. 【实用工具】之VMware workstation 14中安装CentOS 7
  9. vue(组件、路由)懒加载
  10. 平面与网页设计中关于颜色搭配的问题
  11. centOS安装openoffice4.1.6 并解决字体乱码
  12. 支付宝转账支付宝转卡(H5飞行模式)
  13. Mac 编译 llvm / mlir
  14. java缓存击穿_对缓存击穿的一点思考
  15. 【概率论与数理统计】猴博士 笔记 p36-37 协方差、相关系数、不相关、相互独立时的期望和方差
  16. 如何才能骗过面部识别系统?
  17. NASA WIND卫星观测数据作图——origin
  18. 09盘点:梦幻诛仙蜀门剑网三的营销启示
  19. 剑法三套,程序员也能挣大钱
  20. 《Python自然语言处理(第二版)-Steven Bird等》学习笔记:第05章 分类和标注词汇

热门文章

  1. Java动态加载一个类的几种方法以及invoke
  2. Linux环境下的堆栈--调试C程序
  3. 堆状态分析的利器——valgrind的DHAT
  4. Google Test(GTest)使用方法和源码解析——预处理技术分析和应用
  5. 【FFmpeg】如何通过字符串到对应的封装器,以flv为例
  6. 华为atn980传输设备_在头发丝中实现每秒1000张高清DVD传输
  7. 计算机应用 含升学方向,对口升学《计算机应用基础》复习资料总汇(含答案))讲述.doc...
  8. linux signal函数用法,linux信号机制之sigaction构造体浅析,signal 函数,信号捕捉.
  9. python bytearray拼接_python数据类型 ——bytes 和 bytearray
  10. “ Error:(1, 1) java: 非法字符: ‘\ufeff‘ ”错误的解决方法