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