C#FTP类操作解析.docx
- 文档编号:6824600
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:17
- 大小:20.85KB
C#FTP类操作解析.docx
《C#FTP类操作解析.docx》由会员分享,可在线阅读,更多相关《C#FTP类操作解析.docx(17页珍藏版)》请在冰豆网上搜索。
C#FTP类操作解析
1FTP类
Microsoft.NETFramework2.0对文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传文件)
FtpWebRequest类:
实现文件传输协议(FTP)客户端
publicsealedclassFtpWebRequest:
WebRequest
FtpWebResponse类:
封装文件传输协议(FTP)服务器对请求的响应
publicclassFtpWebResponse:
WebResponse,IDisposable
WebRequestMethods.Ftp类:
表示可与FTP请求一起使用的FTP协议方法的类型,无法继承此类publicstaticclassFtp类关系图
2操作ftp的一般步骤
操作ftp的一般步骤我总结如下:
第一步:
WebRequest.Create方法,获得FtpWebRequest的实例
第二步:
利用WebRequestMethods.Ftp设置FtpWebRequest的Method属性,指定使用的FTP协议方法的类型
第三步:
设置FtpWebRequest的Credentials属性,指定用户名和密码
第四步:
发出请求FtpWebResponse
第五步:
接收响应数据流(有些ftp操作可能没这一步,例如给文件夹改名)
第六步:
关闭流
3FTP不同操作程序
下面从几段代码来分别展示ftp的不同操作:
3.1文件夹和文件信息
关键知识说明:
1)FtpWebRequest类没有公开的构造函数,我们通过WebRequest.Create方法,获得FtpWebRequest的实例
2)通过WebRequestMethods.Ftp.ListDirectoryDetails(详细列表)或者WebRequestMethods.Ftp.ListDirectory(简短列表)获取FTP服务器上的文件列表
3)请求返回的数据在GetResponseStream方法返回的流中
4)字符编码请用System.Text.Encoding.Default,要不中文名会乱码
5)FtpWebRequest.Credentials属性设置登陆用户名和密码
6)FtpWebRequest.UseBinary属性,true,指示服务器要传输的是二进制数据.false,指示数据为文本,默认值为true
7)FtpWebRequest.EnableSsl属性,如果控制和数据传输是加密的,则为true.否则为false.默认值为false
实例代码:
获取ftp:
//218.16.229.120/上的文件信息
//创建到达FTP地址的地址对象listRequest
Uriuri=newUri("ftp:
//218.16.229.120/");
FtpWebRequestlistRequest=(FtpWebRequest)WebRequest.Create(uri);
listRequest.Method=WebRequestMethods.Ftp.ListDirectoryDetails;详细列表
//listRequest.Method=WebRequestMethods.Ftp.ListDirectory;简短列表
//登录FTP所需用户名与密码
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
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
{
private
publicFileStruct[]FullListing
{
get
{
return_myListArray.ToArray();
}
}
publicFileStruct[]FileList
{
get
{
List
foreach(FileStructthisstructin_myListArray)
{
if(!
thisstruct.IsDirectory)
{
_fileList.Add(thisstruct);
}
}
return_fileList.ToArray();
}
}
publicFileStruct[]DirectoryList
{
get
{
List
foreach(FileStructthisstructin_myListArray)
{
if(thisstruct.IsDirectory)
{
_dirList.Add(thisstruct);
}
}
return_dirList.ToArray();
}
}
publicDirectoryListParser(stringresponseString)
{
_myListArray=GetList(responseString);
}
privateList
{
List
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
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;
}
}
}
3.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服务器的欢迎信息带有中文,运行这段代码时可能会发生异常(基础连接已经关闭:
服务器提交了协议).
3.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);
3.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);
3.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.StatusDescription);
3.6.得文件大小
关键知识说明:
a.WebRequestMethods.Ftp.GetFileSize表示要用于检索FTP服务器上的文件大小
b.流数据的长度可以从FtpWebResponse.Cont
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FTP 操作 解析
![提示](https://static.bdocx.com/images/bang_tan.gif)