下面的几个步骤包括了使用FtpWebRequest类实现ftp功能的一般过程

1、创建一个FtpWebRequest对象,指向ftp服务器的uri
2、设置ftp的执行方法(上传,下载等)
3、给FtpWebRequest对象设置属性(是否支持ssl,是否使用二进制传输等)
4、设置登录验证(用户名,密码)
5、执行请求
6、接收相应流(如果需要的话)
7、如果没有打开的流,则关闭ftp请求

开发任何ftp应用程序都需要一个相关的ftp服务器及它的配置信息。FtpWebRequest暴露了一些属性来设置这些信息。

接下来的代码示例了上传功能

首先设置一个uri地址,包括路径和文件名。这个uri被使用在FtpWebRequest实例中。

然后根据ftp请求设置FtpWebRequest对象的属性

其中一些重要的属性如下:
    ·Credentials - 指定登录ftp服务器的用户名和密码。
    ·KeepAlive - 指定连接是应该关闭还是在请求完成之后关闭,默认为true
    ·UseBinary - 指定文件传输的类型。有两种文件传输模式,一种是Binary,另一种是ASCII。两种方法在传输时,字节的第8位是不同的。ASCII使用第8位作为错误控制,而Binary的8位都是有意义的。所以当你使用ASCII传输时要小心一些。简单的说,如果能用记事本读和写的文件用ASCII传输就是安全的,而其他的则必须使用Binary模式。当然使用Binary模式发送ASCII文件也是非常好的。
    ·UsePassive - 指定使用主动模式还是被动模式。早先所有客户端都使用主动模式,而且工作的很好,而现在因为客户端防火墙的存在,将会关闭一些端口,这样主动模式将会失败。在这种情况下就要使用被动模式,但是一些端口也可能被服务器的防火墙封掉。不过因为ftp服务器需要它的ftp服务连接到一定数量的客户端,所以他们总是支持被动模式的。这就是我们为什么要使用被动模式的原意,为了确保数据可以正确的传输,使用被动模式要明显优于主动模式。(译者注:主动(PORT)模式建立数据传输通道是由服务器端发起的,服务器使用20端口连接客户端的某一个大于1024的端口;在被动(PASV)模式中,数据传输的通道的建立是由FTP客户端发起的,他使用一个大于1024的端口连接服务器的1024以上的某一个端口)
    ·ContentLength - 设置这个属性对于ftp服务器是有用的,但是客户端不使用它,因为FtpWebRequest忽略这个属性,所以在这种情况下,该属性是无效的。但是如果我们设置了这个属性,ftp服务器将会提前预知文件的大小(在upload时会有这种情况)
    ·Method - 指定当前请求是什么命令(upload,download,filelist等)。这个值定义在结构体WebRequestMethods.Ftp中。
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");
    }
}

以上代码简单的示例了ftp的上传功能。创建一个指向某ftp服务器的FtpWebRequest对象,然后设置其不同的属性Credentials,KeepAlive,Method,UseBinary,ContentLength。

打开本地机器上的文件,把其内容写入ftp请求流。缓冲的大小为2kb,无论上传大文件还是小文件,这都是一个合适的大小。
private void Download(string filePath, string fileName)
{
    FtpWebRequest reqFTP;

try
    {
        FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);

reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP +  t; + fileName));

reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;

reqFTP.UseBinary = true;

reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);

FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();

Stream ftpStream = response.GetResponseStream();

long cl = response.ContentLength;

int bufferSize = 2048;

int readCount;

byte[] buffer = new byte[bufferSize];

readCount = ftpStream.Read(buffer, 0, bufferSize);

while (readCount > 0)
        {
            outputStream.Write(buffer, 0, readCount);

readCount = ftpStream.Read(buffer, 0, bufferSize);
        }

ftpStream.Close();

outputStream.Close();

response.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

上面的代码实现了从ftp服务器上下载文件的功能。这不同于之前所提到的上传功能,下载需要一个响应流,它包含着下载文件的内容。这个下载的文件是在FtpWebRequest对象中的uri指定的。在得到所请求的文件后,通过FtpWebRequest对象的GetResponse()方法下载文件。它将把文件作为一个流下载到你的客户端的机器上。

注意:我们可以设置文件在我们本地机器上的存放路径和名称。
public string[] GetFileList()
{    
    string[] downloadFiles;    
    StringBuilder result = new StringBuilder();    
    FtpWebRequest reqFTP;    
    try    
    {        
        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/  bsp;     
        reqFTP.UseBinary = true;        
        reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);        
        reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;        
        WebResponse response = reqFTP.GetResponse();        
        StreamReader reader = new StreamReader(response.GetResponseStream());        
        string line = reader.ReadLine();        
        while (line != null)        
        {            
            result.Append(line);            
            result.Append("\n");            
            line = reader.ReadLine();        
        }        
        // to remove the trailing '\n'        
        result.Remove(result.ToString().LastIndexOf('\n'), 1);        
        reader.Close();        
        response.Close();        
        return result.ToString().Split('\n');    
    }    
    catch (Exception ex)    
    {        
        System.Windows.Forms.MessageBox.Show(ex.Message);        
        downloadFiles = null;        
        return downloadFiles;    
    }
}
上面的代码示例了如何从ftp服务器上获得文件列表。uri指向ftp服务器的地址。我们使用StreamReader对象来存储一个流,文件名称列表通过“\r\n”分隔开,也就是说每一个文件名称都占一行。你可以使用StreamReader对象的ReadToEnd()方法来得到文件列表。上面的代码中我们用一个StringBuilder对象来保存文件名称,然后把结果通过分隔符分开后作为一个数组返回。我确定只是一个比较好的方法。

其他的实现如Rename,Delete,GetFileSize,FileListDetails,MakeDir等与上面的几段代码类似,就不多说了。

注意:实现重命名的功能时,要把新的名字设置给FtpWebRequest对象的RenameTo属性。连接指定目录的时候,需要在FtpWebRequest对象所使用的uri中指明。


需要注意的地方
你在编码时需要注意以下几点:
    ·除非EnableSsl属性被设置成true,否作所有数据,包括你的用户名和密码都将明文发给服务器,任何监视网络的人都可以获取到你连接服务器的验证信息。如果你连接的ftp服务器提供了SSL,你就应当把EnableSsl属性设置为true。
    ·如果你没有访问ftp服务器的权限,将会抛出SecurityException错误
    ·发送请求到ftp服务器需要调用GetResponse方法。当请求的操作完成后,一个FtpWebResponse对象将返回。这个FtpWebResponse对象提供了操作的状态和已经从ftp服务器上下载的数据。FtpWebResponse对象的StatusCode属性提供了ftp服务器返回的最后的状态代码。FtpWebResponse对象的StatusDescription属性为这个状态代码的描述。

毛毛的小窝

转载于:https://www.cnblogs.com/mjgforever/archive/2007/05/14/745667.html

简单的FTP应用程序相关推荐

  1. linux 下简单的ftp客户端程序

    该ftp的客服端是在linux下面写,涉及的东西也比较简单,如前ftp的简单介绍,知道ftp主要的工作流程架构,套接字的创建,还有就是字符串和字符的处理.使用的函数都是比较简单平常易见的,写的时候感觉 ...

  2. 简单入侵ftp服务器

    C语言在QT下编写简单入侵ftp服务器程序 AttackServer.pro #------------------------------------------------- # # Projec ...

  3. 利用原始socket简单实现FTP的客户端和服务器端程序

    1.设计目的 本设计旨在利用原始socket简单实现FTP(File Transfer Protocol,文件传输协议)的客户端和服务器端程序,能够实现get.put.pwd.dir.cd等基本交互命 ...

  4. [C# 网络编程系列]专题十二:实现一个简单的FTP服务器

    引言: 休息一个国庆节后好久没有更新文章了,主要是刚开始休息完心态还没有调整过来的, 现在差不多进入状态了, 所以继续和大家分享下网络编程的知识,在本专题中将和大家分享如何自己实现一个简单的FTP服务 ...

  5. 应用层——使用 Socket 通信实现 FTP 客户端程序

    转自:http://blog.csdn.net/yixijide/article/details/8280263 简介: FTP 客户端如 FlashFXP,File Zilla 被广泛应用,原理上都 ...

  6. PC上搭建简单的FTP服务器(仅用于局域网)

    PC上搭建简单的FTP服务器(仅用于局域网) 转载请附原文链接:http://blog.fandong.me/2017/07/16/PC-FTP/ 第一步:打开控制面板选择卸载程序(查看方式为类别) ...

  7. 专题十二:实现一个简单的FTP服务器

    引言: 在本专题中将和大家分享如何自己实现一个简单的FTP服务器.在我们平时的上网过程中,一般都是使用FTP的客户端来对商家提供的服务器进行访问(上传.下载文件),例如我们经常用到微软的SkyDriv ...

  8. FTP服务器端程序分类

    FTP服务器端程序有很多种,其中最常见的是vsftpd,顾名思义就是very secure ftp daemon(非常安全的ftp进程). 除此之外还有比vsftpd功能更强大的几种ftp程序: ①  ...

  9. Windows下编译TensorFlow1.3 C++ library及创建一个简单的TensorFlow C++程序

    参考:https://www.cnblogs.com/jliangqiu2016/p/7642471.html Windows下编译TensorFlow1.3 C++ library及创建一个简单的T ...

最新文章

  1. 【转载】Linux下套接字学习
  2. C#6.0语言规范(一) 介绍
  3. 由于连接方在一段时间后没有正确答复或连接的主机_新风换气机使用效果不佳,为何?掌握正确使用方法就好了...
  4. python怎么训练模型_GPU如何训练大批量模型?方法在这里
  5. 自定义OutputFormat案例实操
  6. VPP 20.09版本正式发布
  7. python深度神经网络_深度神经网络 (第七部分)。 神经网络的融合: 堆叠
  8. 可以检测手机帧率和温度的软件_手机帧数测试教学,含免费软件下载,使用方法,数据分析方法详解...
  9. JAVA基础知识点总结
  10. 冰点还原精灵密钥可以用多少台电脑
  11. 三星电脑打开虚拟服务器,三星笔记本进BIOS后怎么开启CPU虚拟化
  12. 洛谷 P1653 猴子 解题报告
  13. Connectable high duty cycle directed advertising
  14. 小米6内存测试软件,小米6采用的是eMMC还是UFS2.1?来测试一下吧
  15. 让学前端不再害怕英语单词(四)
  16. uniapp之地址定位选择,根据字母排序
  17. go语言快速入门:流程控制(7)
  18. javabeans基础
  19. 乡镇级echarts地图json获取、各省市区地图json文件
  20. 鸿蒙系统的通知栏怎么没有静音,微信7.0.0没有消息提示音怎么解决?微信通知栏不显示消息的解决...

热门文章

  1. 软件测试——系统测试总结报告模板
  2. Python小游戏(小蜜蜂)
  3. Select For update语句浅析
  4. django 迁移工程数据库无法创建的问题
  5. Eclipse开发过程中个VM Arguments的设置
  6. GateOne Web SSH 环境搭建
  7. 【.Net Framework 体积大?】不安装.net framework 也能运行!?开篇叙述-1
  8. 微信开发接口调用(前端+.net服务端)
  9. ios 多线程 -- NSOperation 常用方法
  10. 算法-动态规划(01背包)