All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
动态网页技术PHP入门:PHP安装设置技巧_php资料_编程技术
PHP:挑战,Java,.Net_php资料_编程技术
ASP.NET技巧:一个在移动设备中获取路径的方法_.net资料_编程技术
c#数据结构中对数的概念以及使用
SQL Server两种修改对象所有者的方法_[SQL Server教程]
Xml_javascript分页_[XML教程]
.NET字符串的特点,正则表达式在其中如何运用_.net资料_编程技术
ASP.NET技巧:创建不了XMLHTTP控件_.net资料_编程技术
PHP一些常用的正则表达式_[PHP教程]
DIV下图片自适应解决方法_[Html教程]
Reading number is top 10 pictures
教你做读书笔记
9.3阅兵全景图1-抗战老兵和英雄连队梯队
战场废物2
Angie Chiu vijara myth2
BingBingFan apple dew point photo gallery1
Catch prostitution woman in China
A man's favorite things10
白嫩丰满美女照片
Beautiful vacuum girl2
非笑不可:最强爆笑图片精选
Download software ranking
Eclipse 4.2.2 For Win32
Take off clothes to survival
c#程序设计案例教程
DreamWeaver8
星际争霸1.08硬盘免安装版
天龙八部十二宫服务端
实战黑客不求人
Unix video tutorial3
VeryCD电驴(EasyMule) V1.1.9 Build09081
Tram sex maniac 2 (H) rar bag13
delv published in(发表于) 2014/1/16 9:27:05 Edit(编辑)
.net,2.0(c#)下简单的FTP应用程序_[Asp.Net教程]

.net,2.0(c#)下简单的FTP应用程序_[Asp.Net教程]

.net 2.0(c#)下简单的FTP应用程序_[Asp.Net教程]

作者:Neo Matrix
原文发布日期:2007.01.18

本文使用.net 2.0(c#)来实现一般的FTP功能


介绍
微软的.net framework 2.0相对于1.x来说增加了对FTP的支持。以前为了符合我的需求,我不等不使用第三方类库来实现FTP功能,但是为了可靠,还是使用.net framework的类比较好。我的这段代码没有做成可重复使用的类库的形式,但它却是比较容易理解的并能满足你的需求。它可以实现上传,下载,删除等任意功能。在这篇文章的后面将给大家出示.net 2.0下实现ftp的简单代码,使用的语言是c#。或许是因为这是.net新增的类,又或许是第三方类库已经能很好的实现你的需求,.net 2.0的这部分类库并没有得到足够的关注。



背景
作为我的工作的一部分,我已经使用了ftp模块,但是我只能在.net 1.1中去使用它,所以我不能深入的研究.net 2.0下ftp的实现。但是我相信,.ne 2.0下对ftp的支持是非常好的。



代码
不要忘记引入命名空间
using System.Net;
using System.IO;
下面的几个步骤包括了使用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 + "/" + 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 + "/"));
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属性为这个状态代码的描述。


http://www.cnblogs.com/webabcd/archive/2007/01/21/626242.html







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.