C#-FTP类操作解析_第1页
C#-FTP类操作解析_第2页
C#-FTP类操作解析_第3页
C#-FTP类操作解析_第4页
C#-FTP类操作解析_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 19 / 191 FTP类 Microsoft .NET Framework 2.0对文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传文件) FtpWebRequest类:实现文件传输协议(FTP)客户端public sealed class FtpWebRequest : WebRequestFtpWebResponse类:封装文件传输协议(FTP)服务器对请求的响应 public class FtpWebResponse : WebResponse, IDisposableWebRequestMethods.Ftp类:表示可与FTP请求一起使用的FTP协议方法的类型,无法继

2、承此类 public static class Ftp 类关系图 2 操作ftp的一般步骤操作ftp的一般步骤我总结如下:第一步:WebRequest.Create方法,获得FtpWebRequest的实例第二步:利用WebRequestMethods.Ftp设置FtpWebRequest的Method属性,指定使用的FTP协议方法的类型第三步:设置FtpWebRequest的Credentials属性,指定用户名和密码第四步:发出请求 FtpWebResponse第五步:接收响应数据流(有些ftp操作可能没这一步,例如给文件夹改名)第六步:关闭流 3 FTP不同操作程序下面从几段代码来分别展

3、示ftp的不同操作:3.1 文件夹和文件信息关键知识说明:1) FtpWebRequest类没有公开的构造函数,我们通过WebRequest.Create方法,获得FtpWebRequest的实例2) 通过WebRequestMethods.Ftp.ListDirectoryDetails(详细列表)或者WebRequestMethods.Ftp.ListDirectory(简短列表)获取FTP服务器上的文件列表3) 请求返回的数据在GetResponseStream方法返回的流中4) 字符编码请用System.Text.Encoding.Default,要不中文名会乱码5) FtpWebRe

4、quest.Credentials属性设置登陆用户名和密码6) FtpWebRequest.UseBinary属性,true,指示服务器要传输的是二进制数据.false,指示数据为文本,默认值为true7) FtpWebRequest.EnableSsl属性,如果控制和数据传输是加密的,则为true.否则为false.默认值为 false 实例代码:获取20/上的文件信息/创建到达FTP地址的 地址对象listRequestUri uri = new Uri ( "20/" ); FtpWebRequest

5、 listRequest = ( FtpWebRequest ) WebRequest.Create ( uri );listRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 详细列表/listRequest.Method = WebRequestMethods.Ftp.ListDirectory; 简短列表/登录FTP所需 用户名与密码string ftpUser = ""string ftpPassWord = ""listRequest.Credentials = new Ne

6、tworkCredential ( ftpUser , ftpPassWord );/ 由地址对象的创建 文件响应对象FtpWebResponse listResponse = ( FtpWebResponse ) listRequest.GetResponse ( );Stream responseStream = listResponse.GetResponseStream ( );/文件响应流StreamReader readStream = new StreamReader ( responseStream , System.Text.Encoding.Default ); /文件读取

7、流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.ListDirectoryDeta

8、ils(详细列表)或者WebRequestMethods.Ftp.ListDirectory(简短列表)返回的结果是不一样的. 利用WebRequestMethods.Ftp.ListDirectoryDetails,readStream.ReadToEnd ( )返回的字符串比较复杂(不同类型的Ftp会有不同返回形式的返回结果),要把里面的文件夹和文件区分别列出来比较繁琐,代码比较多大概的调用方法如下:string dataString = readStream.ReadToEnd ( );DirectoryListParser parser = new DirectoryListParse

9、r ( dataString );FileStruct fs = parser.FullListing;返回的FileStruct有一个属性IsDirectory,可以区分文件夹和文件DirectoryListParser类代码如下:DirectoryListParserusing System;using System.IO;using System.Net;using System.Text.RegularExpressions;using System.Collections;using System.Collections.Generic;namespace WindowsApplic

10、ationFTP /文件结构体 public struct FileStruct public string Flags; public string Owner; public bool IsDirectory; public string CreateTime; public string Name;/文件类型 public enum FileListStyle UnixStyle, WindowsStyle, Unknown/ public class DirectoryListParser private <FileStruct> _myListArray; public

11、FileStruct FullListing get return _myListArray.ToArray(); public FileStruct FileList get List<FileStruct> _fileList = new List<FileStruct>(); foreach(FileStruct thisstruct in _myListArray) if(!thisstruct.IsDirectory) _fileList.Add(thisstruct); return _fileList.ToArray(); public FileStruc

12、t DirectoryList get List<FileStruct> _dirList = new List<FileStruct>(); foreach(FileStruct thisstruct in _myListArray) if(thisstruct.IsDirectory) _dirList.Add(thisstruct); return _dirList.ToArray(); public DirectoryListParser(string responseString) _myListArray = GetList(responseString);

13、 private List<FileStruct> GetList(string datastring) List<FileStruct> myListArray = new List<FileStruct>(); string dataRecords = datastring.Split('n'); FileListStyle _directoryListStyle = GuessFileListStyle(dataRecords); foreach (string s in dataRecords) if (_directoryListS

14、tyle != FileListStyle.Unknown && s != "") FileStruct f = new FileStruct(); f.Name = "." switch (_directoryListStyle) case FileListStyle.UnixStyle: f = ParseFileStructFromUnixStyleRecord(s); break; case FileListStyle.WindowsStyle: f = ParseFileStructFromWindowsStyleRecord(

15、s); break; if (f.Name != "" && f.Name != "." && f.Name != ".") myListArray.Add(f); return myListArray; private FileStruct ParseFileStructFromWindowsStyleRecord(string Record) /Assuming the record style as / 02-03-04 07:46PM <DIR> Append FileStruct

16、f = new FileStruct(); string processstr = Record.Trim(); string dateStr = processstr.Substring(0,8); processstr = (processstr.Substring(8, processstr.Length - 8).Trim(); string timeStr = processstr.Substring(0, 7); processstr = (processstr.Substring(7, processstr.Length - 7).Trim(); f.CreateTime = d

17、ateStr + " " + timeStr; if (processstr.Substring(0,5) = "<DIR>") f.IsDirectory = true; processstr = (processstr.Substring(5, processstr.Length - 5).Trim(); else string strs = processstr.Split(new char ' ' , StringSplitOptions.RemoveEmptyEntries); processstr = strs1;

18、 f.IsDirectory = false; f.Name = processstr; /Rest is name return f; public FileListStyle GuessFileListStyle(string recordList) foreach (string s in recordList) if(s.Length > 10 && Regex.IsMatch(s.Substring(0,10),"(-|d)(-|r)(-|w)(-|x)3") return FileListStyle.UnixStyle; else if (

19、s.Length > 8 && Regex.IsMatch(s.Substring(0, 8), "0-92-0-92-0-92") return FileListStyle.WindowsStyle; return FileListStyle.Unknown; private FileStruct ParseFileStructFromUnixStyleRecord(string record) /Assuming record style as / dr-xr-xr-x 1 owner group 0 Nov 25 2002 bussys File

20、Struct f = new FileStruct(); if (record0 = '-' | record0 = 'd') / its a valid file record string processstr = record.Trim(); f.Flags = processstr.Substring(0, 9); f.IsDirectory = (f.Flags0 = 'd'); processstr = (processstr.Substring(11).Trim(); _cutSubstringFromStringWithTrim(

21、ref processstr, ' ', 0); /skip one part f.Owner = _cutSubstringFromStringWithTrim(ref processstr, ' ', 0); f.CreateTime = getCreateTimeString(record); int fileNameIndex = record.IndexOf(f.CreateTime)+f.CreateTime.Length; f.Name = record.Substring(fileNameIndex).Trim(); /Rest of the p

22、art is name else f.Name = "" return f; private string getCreateTimeString(string record) /Does just basic datetime string validation for demo, not an accurate check /on date and time fields string month = "(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)" string space = "(0

23、40)+" string day = "(0-9|1-30-9)" string year = "1-20-93" string time = "0-91,2:0-92" Regex dateTimeRegex = new Regex(month+space+day+space+"("+year+"|"+time+")", RegexOptions.IgnoreCase); Match match = dateTimeRegex.Match(record); ret

24、urn match.Value; private string _cutSubstringFromStringWithTrim(ref string s, char c, int startIndex) int pos1 = s.IndexOf(c, startIndex); string retString = s.Substring(0,pos1); s = (s.Substring(pos1).Trim(); return retString; 3.2.取ftp登陆身份验证完成后的欢迎信息关键知识说明:a.FtpWebResponse.WelcomeMessage属性获取身份验证完成时F

25、TP服务器发送的消息实例代码:获取20/登陆身份验证完成后的欢迎信息Uri uri = new Uri ( "20/" );FtpWebRequest listRequest = ( FtpWebRequest ) WebRequest.Create ( uri );listRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;string ftpUser = ""string ftpPassWord = "&q

26、uot;listRequest.Credentials = new NetworkCredential ( ftpUser , ftpPassWord );FtpWebResponse listResponse = ( FtpWebResponse ) listRequest.GetResponse ( );MessageBox.Show ( listResponse.WelcomeMessage );附加说明:要是FTP服务器的欢迎信息带有中文,运行这段代码时可能会发生异常(基础连接已经关闭: 服务器提交了协议).3.3.重命名目录关键知识说明:a.WebRequestMethods.Ftp

27、.Rename表示重命名目录的FTP协议方法b.FtpWebRequest.RenameTo属性重命名的新名称实例代码:把20/上的a目录重命名为avUri uri = new Uri ( "20/a" );FtpWebRequest listRequest = ( FtpWebRequest ) WebRequest.Create ( uri );listRequest.Method = WebRequestMethods.Ftp.Rename;string ftpUser = ""s

28、tring ftpPassWord = ""listRequest.Credentials = new NetworkCredential ( ftpUser , ftpPassWord );listRequest.RenameTo = "av"FtpWebResponse listResponse = ( FtpWebResponse ) listRequest.GetResponse ( );MessageBox.Show ( listResponse.StatusDescription );3.4.删除目录关键知识说明:a.WebRequestMe

29、thods.Ftp.RemoveDirectory表示移除目录的FTP协议方法实例代码:删除20/上的av文件夹Uri uri = new Uri ( "20/av" );FtpWebRequest listRequest = ( FtpWebRequest ) WebRequest.Create ( uri );listRequest.Method = WebRequestMethods.Ftp.RemoveDirectory;string ftpUser = ""string ftp

30、PassWord = ""listRequest.Credentials = new NetworkCredential ( ftpUser , ftpPassWord );FtpWebResponse listResponse = ( FtpWebResponse ) listRequest.GetResponse ( ); MessageBox.Show ( listResponse.StatusDescription ); 3.5.新建目录关键知识说明:a.WebRequestMethods.Ftp.MakeDirectory表示在FTP服务器上创建目录的协议方法实例

31、代码:在20/上建立目录vbUri uri = new Uri ( "20/vb" );FtpWebRequest listRequest = ( FtpWebRequest ) WebRequest.Create ( uri );listRequest.Method = WebRequestMethods.Ftp.MakeDirectory;string ftpUser = ""string ftpPassWord = ""listRequest.Credentia

32、ls = new NetworkCredential ( ftpUser , ftpPassWord );FtpWebResponse listResponse = ( FtpWebResponse ) listRequest.GetResponse ( );MessageBox.Show ( listResponse.StatusDescription ); 3.6.得文件大小关键知识说明:a.WebRequestMethods.Ftp.GetFileSize表示要用于检索FTP服务器上的文件大小b.流数据的长度可以从FtpWebResponse.ContentLength属性中获取。实例代

33、码:获取20/上的会议记录.doc文件大小Uri uri = new Uri ( "20/会议记录.doc" );FtpWebRequest listRequest = ( FtpWebRequest ) WebRequest.Create ( uri );listRequest.Method = WebRequestMethods.Ftp.GetFileSize;string ftpUser = ""string ftpPassWord = ""listReques

34、t.Credentials = new NetworkCredential ( ftpUser , ftpPassWord );FtpWebResponse listResponse = ( FtpWebResponse ) listRequest.GetResponse ( );MessageBox.Show ( string.Format ( "文件大小: 0" , listResponse.ContentLength ) );3.7.删除文件关键知识说明:a.WebRequestMethods.Ftp.DeleteFile表示要用于删除FTP服务器上的文件实例代码:删

35、除20/工作安排.txt文件Uri uri = new Uri ( "20/工作安排.txt" );FtpWebRequest listRequest = ( FtpWebRequest ) WebRequest.Create ( uri );listRequest.Method = WebRequestMethods.Ftp.DeleteFile;string ftpUser = ""string ftpPassWord = ""listRequest.Creden

36、tials = new NetworkCredential ( ftpUser , ftpPassWord );FtpWebResponse listResponse = ( FtpWebResponse ) listRequest.GetResponse ( );MessageBox.Show ( string.Format ( "Delete status: 0" , listResponse.StatusDescription ) ); 3.8.上传文件关键知识说明:1) WebRequestMethods.Ftp.UploadFile表示将文件上载到FTP服务器2)

37、 使用FtpWebRequest对象向服务器上载文件,则必须将文件内容写入请求流,请求流是通过调用FtpWebRequest.GetRequestStream方法.如果未将属性设置为UploadFile,则不能获取流。3) 异步对应方法(FtpWebRequest.BeginGetRequestStream方法和FtpWebRequest.EndGetRequestStream 方法),关于异步上传的实现我会再写在下篇总汇中实例代码:上载文件D:abc.txt到20/上Stream requestStream = null;FileStream fileStr

38、eam = null;FtpWebResponse uploadResponse = null; try Uri uri = new Uri ( "20/abc.txt" ); FtpWebRequest uploadRequest = ( FtpWebRequest ) WebRequest.Create ( uri ); uploadRequest.Method = WebRequestMethods.Ftp.UploadFile; string ftpUser = "" string ftpPassWord = &

39、quot;" uploadRequest.Credentials = new NetworkCredential ( ftpUser , ftpPassWord );requestStream = uploadRequest.GetRequestStream ( );/请求流中 fileStream = File.Open ( "D:abc.txt" , FileMode.Open ); byte buffer = new byte 1024 ; int bytesRead; while ( true ) bytesRead = fileStream.Read (

40、 buffer , 0 , buffer.Length ); if ( bytesRead = 0 ) break; requestStream.Write ( buffer , 0 , bytesRead ); requestStream.Close ( ); uploadResponse = ( FtpWebResponse ) uploadRequest.GetResponse ( ); MessageBox.Show ( "Upload complete." );finally if ( uploadResponse != null ) uploadResponse

41、.Close ( ); if ( fileStream != null ) fileStream.Close ( ); if ( requestStream != null ) requestStream.Close ( );其实利用WebClient.UploadData方法,还有一种更简单的上传方法:WebClient request = new WebClient ( );string ftpUser = ""string ftpPassWord = ""request.Credentials = new NetworkCredential ( f

42、tpUser , ftpPassWord );FileStream myStream = new FileStream ( "D:abcd.txt" , FileMode.Open , FileAccess.Read );byte dataByte = new byte myStream.Length ;myStream.Read ( dataByte , 0 , dataByte.Length ); /写到2进制数组中myStream.Close ( );request.UploadData ( "20/abcd.txt&quo

43、t; , dataByte ); 3.9.下载文件关键知识说明:1) WebRequestMethods.Ftp.DownloadFile表示要用于从FTP服务器下载文件2) 从FTP服务器下载文件时,如果命令成功,所请求的文件的内容即在响应对象的流中。通过调用FtpWebResponse.GetResponseStream方法,可以访问此流。1) 实例代码:从20/上下载文件保存到d:abc.txtStream responseStream = null;FileStream fileStream = null;StreamReader reader = n

44、ull;try string downloadUrl = "20/abc.txt" FtpWebRequest downloadRequest = ( FtpWebRequest ) WebRequest.Create ( downloadUrl ); downloadRequest.Method = WebRequestMethods.Ftp.DownloadFile; string ftpUser = "" string ftpPassWord = "" downloadRequest.Crede

45、ntials = new NetworkCredential ( ftpUser , ftpPassWord ); FtpWebResponse downloadResponse = ( FtpWebResponse ) downloadRequest.GetResponse ( ); responseStream = downloadResponse.GetResponseStream ( ); fileStream = File.Create ( "d:" + "abc.txt" ); byte buffer = new byte 1024 ; in

46、t bytesRead; while ( true ) bytesRead = responseStream.Read ( buffer , 0 , buffer.Length ); if ( bytesRead = 0 ) break; fileStream.Write ( buffer , 0 , bytesRead ); MessageBox.Show ( "Download complete" );finally if ( reader != null ) reader.Close ( ); else if ( responseStream != null ) re

47、sponseStream.Close ( ); if ( fileStream != null ) fileStream.Close ( ); 其实利用WebClient.DownloadData方法,还有一种更简单的下载方法:Uri uri = new Uri ( "20/abc.txt" );WebClient request = new WebClient ( );string ftpUser = ""string ftpPassWord = ""request.Credentials = new NetworkCredential ( ftpUser , ftpPassWord );byte newFileData = request.DownloadData ( uri.ToString ( ) );FileStream fs

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论