天道酬勤

博观而约取,厚积而薄发!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Snake.Net网络通讯模块 - FTP(四) (转载)

Posted on 2010-04-27 23:16  Happy Coding  阅读(348)  评论(0编辑  收藏  举报

原文地址:http://www.cnblogs.com/soulroom/archive/2005/09/13/235642.html

作者: Bruce

 

本页内容

简介
登录FTP服务器
获取目录和文件列表
主动模式与被动模式
目录操作
上传和下载文件
断点续传
删除文件

 

 

简介

文件传输协议(FILE TRANSFER PROTOCOL)是一个用于在两台装有不同操作系统的机器中传输计算机文件的软件标准。它属于网络协议组的应用层。
FTP是一个8位的客户端-服务器协议,能操作任何类型的文件而不需要进一步处理,就像MIME或Unencode一样。FTP服务一般运行在两个端口上。端口21用于传输控制流,并且是命令通向ftp服务器的进口。另一个端口用于在客户端和服务器之间传输数据流,端口号将由系统自动分配。使用FTP协议传输文件有以下优点:
1. 促进文件的共享(计算机程序或数据)
2. 鼓励间接或者隐式的使用远程计算机
3. 向用户屏蔽不同主机中各种文件存储系统的细节
4. 可靠和高效的传输数据
在命名空间Eastasp.Framework.Net.Ftp下,Snake.Net提供一系列类和函数,可以为开发者提供全面而完善的使用FTP协议传输文件的功能。现在主要介绍FtpClient和FtpExpress 两个类是如何实现发送传输文件的功能。

登录FTP服务器


FTP一般需要用户名和密码才能登录,也可以使用匿名登录,此时一般以Anonymous作为用户名登录,用户的Email地址作为密码。请看演示代码。

//declare
FtpServer server;
FtpClient client;

server = new FtpServer("ftp.server.com", "user", "password");
client = new FtpClient(server);


try
{
         client.Open();
         client.Noop();
}

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

获取目录和文件列表


文件夹和文件在FTP服务器上按照一定的规则进行管理,就如同本地文件夹一样。一般而言,在FTP服务器上存放了大量的文件并按照一定的规律进行放置,使用者必须浏览目录,然后选择自己需要的文件,进行下载。FtpClient提供了List命令列出服务器上的文件夹河文件。请看演示代码:

//declare
FtpServer server;
FtpClient client;

string
remotePath;
FtpPoint point;
FtpFileInfo[] files;
FtpDirectoryInfo[] directories;

remotePath = "";
server = new FtpServer("ftp.server.com", "user", "password");
client = new FtpClient(server);


try
{
         client.Open();
         client.Type(FtpTransferType.ASCII);
         point = client.List(remotePath);

         //get directories
         directories = point.Directories;
         if (directories.Length > 0){
                   for (int i = 0; i < directories.Length; i++){
                            Console.WriteLine(directories[i].Name);
                   }
         }

         //get files
         files = point.Files;
         if (files.Length > 0){
                   for(int i = 0; i < files.Length; i++){
                            Console.WriteLine(files[i].Name);
                   }
         }
}

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


针对不同的FTP服务器软件,FTP目录输出的格式也不尽相同。主要有两种Unix和MSDOS,当前绝大多数FTP服务器使用的是Unix格式,一般情况下只有IIS下的FTP可能会是MSDOS格式,可以设置FtpServer对象的Type属性将其设置为MSDOS模式请看下面的代码:

//declare
FtpServer server;

server = new FtpServer("ftp.server.com", "user", "password");
server.Type = FtpServerType.MsDos;

 

主动模式与被动模式


FTP有两种使用模式:主动和被动。主动模式要求客户端和服务器端同时打开并且监听一个端口以建立连接。在这种情况下,客户端由于安装了防火墙会产生一些问题。所以,创立了被动模式。被动模式只要求服务器端产生一个监听相应端口的进程,这样就可以绕过客户端安装了防火墙的问题。主动模式和被动模式在Snake.Net里分别对应FtpConnectionType枚举类型的Port和Pasv。你可以通过FtpClient的ConnectionType属性进行设置。

//declare
FtpClient client;
client.ConnectionType = FtpConnectionType.Port;



目录操作


如同本地目录一样对Ftp服务器上的目录也可以进行创建、删除、重命名等操作。FtpClient提供了以下命令用于操作服务器断的目录。
Pwd 获取当前目录位置信息
Cwd 将指定目录设置为当前目录
Mkd 在当前目录下创建指定目录
Rmd 在当前目录下删除指定目录
Move 变更目录名称,此命令对文件同样有效。

//declare
FtpClient client;

//initialize
client = new FtpClient(new FtpServer("ftp.server.com", "user", "password"));
client.ConnectionType = FtpConnectionType.Port;


try
{
         client.Open();
         client.Noop();

         //changes the current directory
         client.Cwd("/");
         client.Type(FtpTransferType.ASCII);

         //create directory t
         client.Mkd("t");

         //changes the current directory
         client.Cwd("t");

         //output current directory info
         Console.WriteLine(client.Pwd());

         //create directory aa and bb
         client.Mkd("aa"); client.Mkd("bb");

         //rename directory aa to cc
         client.Move("aa", "cc");

         //delete directory bb and cc
         client.Rmd("bb"); client.Rmd("cc");

         //go up directory
         client.Cwd("..");

         //delete directory t
         client.Rmd("t");
}

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


上传和下载文件

FTP既然是文件传输协议,上传和下载当然是其最主要的功能,FtpClient提供Store方法用于上传文件,Retrieve方法用于下载文件。请看一下上传的演示代码:

//declare
FtpClient client;

string
localFile;

localFile = @"c:\a.dat";
client = new FtpClient(new FtpServer("ftp.server.com", "user", "password"));
client.ConnectionType = FtpConnectionType.Port;


try
{
         client.Open(); client.Noop();
         client.Type(FtpTransferType.Image);
         client.Store(localFile);
}

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

接下来我们在看一下文件下载的演示代码:

//declare
FtpClient client;

string
localFile, remoteFile;

remoteFile = "a.dat";
localFile = string.Format(@"c:\2{0}", remoteFile);
client = new FtpClient(new FtpServer("ftp.server.com", "user", "password"));
client.ConnectionType = FtpConnectionType.Port;


try
{
         client.Open(); client.Noop();
         client.Type(FtpTransferType.Image);
         client.Retrieve(localFile, remoteFile);
}

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


断点续传


有时用户通过FTP上传或下载文件需历时数小时,万一线路中断,不具有FTP断点续传的FTP服务器就只能从头重传; 对于具有断点续传功能的服务器来说,允许用户从上次断掉的地方继续传送,而不必从头开始。FtpClient使用Rest命令设置断点。FtpClient的Store和Retrieve方法自身也支持对文件的断点支持。参见下面代码:

//设置断点
client.Rest(1000);


//
上传文件
client.Store(localFile);


//
从文件第1000个字节后上传
client.Store(localFile, 1000);

Store和Retrieve方法提供了多种不同的参数,实现了各种情况下的文件上传和下载。

删除文件


删除一个远程Ftp服务器上的文件比较简单,只需调用FtpClient的Delete命令即可,请看代码:

//declare
FtpClient client;

string
remoteFile;

remoteFile = "a.dat";
client = new FtpClient(new FtpServer("ftp.server.com", "user", "password"));
client.ConnectionType = FtpConnectionType.Port;


try
{
         client.Open(); client.Noop();
         client.Type(FtpTransferType.Image);
         client.Delete(remoteFile);
}

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