C#FTP类操作解析.docx

上传人:b****2 文档编号:3159819 上传时间:2023-05-05 格式:DOCX 页数:22 大小:20.36KB
下载 相关 举报
C#FTP类操作解析.docx_第1页
第1页 / 共22页
C#FTP类操作解析.docx_第2页
第2页 / 共22页
C#FTP类操作解析.docx_第3页
第3页 / 共22页
C#FTP类操作解析.docx_第4页
第4页 / 共22页
C#FTP类操作解析.docx_第5页
第5页 / 共22页
C#FTP类操作解析.docx_第6页
第6页 / 共22页
C#FTP类操作解析.docx_第7页
第7页 / 共22页
C#FTP类操作解析.docx_第8页
第8页 / 共22页
C#FTP类操作解析.docx_第9页
第9页 / 共22页
C#FTP类操作解析.docx_第10页
第10页 / 共22页
C#FTP类操作解析.docx_第11页
第11页 / 共22页
C#FTP类操作解析.docx_第12页
第12页 / 共22页
C#FTP类操作解析.docx_第13页
第13页 / 共22页
C#FTP类操作解析.docx_第14页
第14页 / 共22页
C#FTP类操作解析.docx_第15页
第15页 / 共22页
C#FTP类操作解析.docx_第16页
第16页 / 共22页
C#FTP类操作解析.docx_第17页
第17页 / 共22页
C#FTP类操作解析.docx_第18页
第18页 / 共22页
C#FTP类操作解析.docx_第19页
第19页 / 共22页
C#FTP类操作解析.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C#FTP类操作解析.docx

《C#FTP类操作解析.docx》由会员分享,可在线阅读,更多相关《C#FTP类操作解析.docx(22页珍藏版)》请在冰点文库上搜索。

C#FTP类操作解析.docx

C#FTP类操作解析

Microsoft.NETFramework2.0对文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传文件)【字体:

大中小】

作者:

[tcconan]来源:

[13COM.NET收集整理]浏览:

[154]评论:

[1]

关键字:

Microsoft.NETFramework2.0新增加了3个类使我们很方便的对文件传输协议(FTP)服务器进行操作

FtpWebRequest类:

实现文件传输协议(FTP)客户端

publicsealedclassFtpWebRequest:

WebRequest

FtpWebResponse类:

封装文件传输协议(FTP)服务器对请求的响应

publicclassFtpWebResponse:

WebResponse,IDisposable

WebRequestMethods.Ftp类:

表示可与FTP请求一起使用的FTP协议方法的类型,无法继承此类

publicstaticclassFtp

类关系图

操作ftp的一般步骤我总结如下:

第一步:

WebRequest.Create方法,获得FtpWebRequest的实例

第二步:

利用WebRequestMethods.Ftp设置FtpWebRequest的Method属性,指定使用的FTP协议方法的类型

第三步:

设置FtpWebRequest的Credentials属性,指定用户名和密码

第四步:

发出请求FtpWebResponse

第五步:

接收响应数据流(有些ftp操作可能没这一步,例如给文件夹改名)

第六步:

关闭流

下面从几段代码来分别展示ftp的不同操作:

1.文件夹和文件信息

关键知识说明:

a.FtpWebRequest类没有公开的构造函数,我们通过WebRequest.Create方法,获得FtpWebRequest的实例

b.通过WebRequestMethods.Ftp.ListDirectoryDetails(详细列表)或者WebRequestMethods.Ftp.ListDirectory(简短列表)获取FTP服务器上的文件列表

c.请求返回的数据在GetResponseStream方法返回的流中

d.字符编码请用System.Text.Encoding.Default,要不中文名会乱码

e.FtpWebRequest.Credentials属性设置登陆用户名和密码

f.FtpWebRequest.UseBinary属性,true,指示服务器要传输的是二进制数据.false,指示数据为文本。

默认值为true

g.FtpWebRequest.EnableSsl属性,如果控制和数据传输是加密的,则为true.否则为false.默认值为false

实例代码:

获取ftp:

//218.16.229.120/上的文件信息

Uriuri=newUri("ftp:

//218.16.229.120/");

FtpWebRequestlistRequest=(FtpWebRequest)WebRequest.Create(uri);

listRequest.Method=WebRequestMethods.Ftp.ListDirectoryDetails;

//listRequest.Method=WebRequestMethods.Ftp.ListDirectory;

stringftpUser="";

stringftpPassWord="";

listRequest.Credentials=newNetworkCredential(ftpUser,ftpPassWord);

FtpWebResponselistResponse=(FtpWebResponse)listRequest.GetResponse();

StreamresponseStream=listResponse.GetResponseStream();

StreamReaderreadStream=newStreamReader(responseStream,System.Text.Encoding.Default);

if(readStream!

=null)

{

MessageBox.Show(readStream.ReadToEnd());

}

MessageBox.Show(string.Format("状态:

{0},{1}",listResponse.StatusCode,listResponse.StatusDescription));

listResponse.Close();

responseStream.Close();

readStream.Close();

通过WebRequestMethods.Ftp.ListDirectoryDetails(详细列表)或者WebRequestMethods.Ftp.ListDirectory(简短列表)返回的结果是不一样的.请看图

利用WebRequestMethods.Ftp.ListDirectoryDetails,readStream.ReadToEnd()返回的字符串比较复杂(不同类型的Ftp会有不同返回形式的返回结果),要把里面的文件夹和文件区分别列出来比较繁琐,代码比较多.

大概的调用方法如下:

stringdataString=readStream.ReadToEnd();

DirectoryListParserparser=newDirectoryListParser(dataString);

FileStruct[]fs=parser.FullListing;

返回的FileStruct有一个属性IsDirectory,可以区分文件夹和文件

DirectoryListParser类代码如下:

DirectoryListParser

--

CodehighlightingproducedbyActiproCodeHighlighter(freeware)

http:

//www.CodeH

-->usingSystem;

usingSystem.IO;

usingSystem.Net;

usingSystem.Text.RegularExpressions;

usingSystem.Collections;

usingSystem.Collections.Generic;

namespaceWindowsApplicationFTP

{

publicstructFileStruct

{

publicstringFlags;

publicstringOwner;

publicboolIsDirectory;

publicstringCreateTime;

publicstringName;

}

publicenumFileListStyle

{

UnixStyle,

WindowsStyle,

Unknown

}

publicclassDirectoryListParser

{

privateList_myListArray;

publicFileStruct[]FullListing

{

get

{

return_myListArray.ToArray();

}

}

publicFileStruct[]FileList

{

get

{

List_fileList=newList();

foreach(FileStructthisstructin_myListArray)

{

if(!

thisstruct.IsDirectory)

{

_fileList.Add(thisstruct);

}

}

return_fileList.ToArray();

}

}

publicFileStruct[]DirectoryList

{

get

{

List_dirList=newList();

foreach(FileStructthisstructin_myListArray)

{

if(thisstruct.IsDirectory)

{

_dirList.Add(thisstruct);

}

}

return_dirList.ToArray();

}

}

publicDirectoryListParser(stringresponseString)

{

_myListArray=GetList(responseString);

}

privateListGetList(stringdatastring)

{

ListmyListArray=newList();

string[]dataRecords=datastring.Split('\n');

FileListStyle_directoryListStyle=GuessFileListStyle(dataRecords);

foreach(stringsindataRecords)

{

if(_directoryListStyle!

=FileListStyle.Unknown&&s!

="")

{

FileStructf=newFileStruct();

f.Name="..";

switch(_directoryListStyle)

{

caseFileListStyle.UnixStyle:

f=ParseFileStructFromUnixStyleRecord(s);

break;

caseFileListStyle.WindowsStyle:

f=ParseFileStructFromWindowsStyleRecord(s);

break;

}

if(f.Name!

=""&&f.Name!

="."&&f.Name!

="..")

{

myListArray.Add(f);

}

}

}

returnmyListArray;

}

privateFileStructParseFileStructFromWindowsStyleRecord(stringRecord)

{

///Assumingtherecordstyleas

///02-03-0407:

46PM

Append

FileStructf=newFileStruct();

stringprocessstr=Record.Trim();

stringdateStr=processstr.Substring(0,8);

processstr=(processstr.Substring(8,processstr.Length-8)).Trim();

stringtimeStr=processstr.Substring(0,7);

processstr=(processstr.Substring(7,processstr.Length-7)).Trim();

f.CreateTime=dateStr+""+timeStr;

if(processstr.Substring(0,5)=="

")

{

f.IsDirectory=true;

processstr=(processstr.Substring(5,processstr.Length-5)).Trim();

}

else

{

string[]strs=processstr.Split(newchar[]{''},StringSplitOptions.RemoveEmptyEntries);

processstr=strs[1];

f.IsDirectory=false;

}

f.Name=processstr;//Restisname

returnf;

}

publicFileListStyleGuessFileListStyle(string[]recordList)

{

foreach(stringsinrecordList)

{

if(s.Length>10

&&Regex.IsMatch(s.Substring(0,10),"(-|d)((-|r)(-|w)(-|x)){3}"))

{

returnFileListStyle.UnixStyle;

}

elseif(s.Length>8

&&Regex.IsMatch(s.Substring(0,8),"[0-9]{2}-[0-9]{2}-[0-9]{2}"))

{

returnFileListStyle.WindowsStyle;

}

}

returnFileListStyle.Unknown;

}

privateFileStructParseFileStructFromUnixStyleRecord(stringrecord)

{

///Assumingrecordstyleas

///dr-xr-xr-x1ownergroup0Nov252002bussys

FileStructf=newFileStruct();

if(record[0]=='-'||record[0]=='d')

{//itsavalidfilerecord

stringprocessstr=record.Trim();

f.Flags=processstr.Substring(0,9);

f.IsDirectory=(f.Flags[0]=='d');

processstr=(processstr.Substring(11)).Trim();

_cutSubstringFromStringWithTrim(refprocessstr,'',0);//skiponepart

f.Owner=_cutSubstringFromStringWithTrim(refprocessstr,'',0);

f.CreateTime=getCreateTimeString(record);

intfileNameIndex=record.IndexOf(f.CreateTime)+f.CreateTime.Length;

f.Name=record.Substring(fileNameIndex).Trim();//Restofthepartisname

}

else

{

f.Name="";

}

returnf;

}

privatestringgetCreateTimeString(stringrecord)

{

//Doesjustbasicdatetimestringvalidationfordemo,notanaccuratecheck

//ondateandtimefields

stringmonth="(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)";

stringspace=@"(\040)+";

stringday="([0-9]|[1-3][0-9])";

stringyear="[1-2][0-9]{3}";

stringtime="[0-9]{1,2}:

[0-9]{2}";

RegexdateTimeRegex=newRegex(month+space+day+space+"("+year+"|"+time+")",RegexOptions.IgnoreCase);

Matchmatch=dateTimeRegex.Match(record);

returnmatch.Value;

}

privatestring_cutSubstringFromStringWithTrim(refstrings,charc,intstartIndex)

{

intpos1=s.IndexOf(c,startIndex);

stringretString=s.Substring(0,pos1);

s=(s.Substring(pos1)).Trim();

returnretString;

}

}

}

2.取ftp登陆身份验证完成后的欢迎信息

关键知识说明:

a.FtpWebResponse.WelcomeMessage属性获取身份验证完成时FTP服务器发送的消息

实例代码:

获取ftp:

//218.16.229.120/登陆身份验证完成后的欢迎信息

Uriuri=newUri("ftp:

//218.16.229.120/");

FtpWebRequestlistRequest=(FtpWebRequest)WebRequest.Create(uri);

listRequest.Method=WebRequestMethods.Ftp.ListDirectoryDetails;

stringftpUser="";

stringftpPassWord="";

listRequest.Credentials=newNetworkCredential(ftpUser,ftpPassWord);

FtpWebResponselistResponse=(FtpWebResponse)listRequest.GetResponse();

MessageBox.Show(listResponse.WelcomeMessage);

附加说明:

要是FTP服务器的欢迎信息带有中文,运行这段代码时可能会发生异常(基础连接已经关闭:

服务器提交了协议).

解决办法:

打补丁Microsoft.NETFramework2.0ServicePack1

3.重命名目录

关键知识说明:

a.WebRequestMethods.Ftp.Rename表示重命名目录的FTP协议方法

b.FtpWebRequest.RenameTo属性重命名的新名称

实例代码:

把ftp:

//218.16.229.120/上的a目录重命名为av

Uriuri=newUri("ftp:

//218.16.229.120/a");

FtpWebRequestlistRequest=(FtpWebRequest)WebRequest.Create(uri);

listRequest.Method=WebRequestMethods.Ftp.Rename;

stringftpUser="";

stringftpPassWord="";

listRequest.Credentials=newNetworkCredential(ftpUser,ftpPassWord);

listRequest.RenameTo="av";

FtpWebResponselistResponse=(FtpWebResponse)listRequest.GetResponse();

MessageBox.Show(listResponse.StatusDescription);

4.删除目录

关键知识说明:

a.WebRequestMethods.Ftp.RemoveDirectory表示移除目录的FTP协议方法

实例代码:

删除ftp:

//218.16.229.120/上的av文件夹

Uriuri=newUri("ftp:

//218.16.229.120/av");

FtpWebRequestlistRequest=(FtpWebRequest)WebRequest.Create(uri);

listRequest.Method=WebRequestMethods.Ftp.RemoveDirectory;

stringftpUser="";

stringftpPassWord="";

listRequest.Credentials=newNetworkCredential(ftpUser,ftpPassWord);

FtpWebResponselistResponse=(FtpWebResponse)listRequest.GetResponse();

MessageBox.Show(listResponse.StatusDescription);

5.新建目录

关键知识说明:

a.WebRequestMethods.Ftp.MakeDirectory表示在FTP服务器上创建目录的协议方法

实例代码:

在ftp:

//218.16.229.120/上建立目录vb

Uriuri=newUri("ftp:

//218.16.229.120/vb");

FtpWebRequestlistRequest=(FtpWebRequest)WebRequest.Create(uri);

listRequest.Method=WebRequestMethods.Ftp.MakeDirectory;

stringftpUser="";

stringftpPassWord="";

listRequest.Credentials=newNetworkCredential(ftpUser,ftpPassWord);

FtpWebResponselistResponse=(FtpWebResponse)listRequest.GetResponse();

MessageBox.Show(listResponse.StatusDescript

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 冶金矿山地质

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2