C#封装的完整FTP类.doc_第1页
C#封装的完整FTP类.doc_第2页
C#封装的完整FTP类.doc_第3页
C#封装的完整FTP类.doc_第4页
C#封装的完整FTP类.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

功能1.建立FTP链接2.支持代理3.多种重载的同步上传文件4.多种重载的异步上传文件5.多种重载的同步下载文件6.多种重载的异步下载文件7.上传文件的进度百分比8.下载文件的进度白分比9.有区分的列出目录或者文件的信息(考虑到MS DOS显示格式和UNIX格式)10.目录或文件存在的判断11.删除文件12.重命名文件、目录13.在FTP服务器上面拷贝、移动文件(许多人可能在苦苦寻找这个功能)14.建立、删除目录15.目录切换操作(很新颖哦 J)公共构造函数名称说明clsFTP()初始化clsFtp类的新实例clsFTP(Uri FtpUri, string strUserName, string strPassword)由FTP地址、FTP登录用户信息、FTP登录用户密码初始化clsFtp类的新实例clsFTP(Uri FtpUri, string strUserName, string strPassword, WebProxy objProxy)由FTP地址、FTP登录用户信息、FTP登录用户密码、代理服务器对象初始化clsFtp类的新实例公共属性名称说明Uri获取或设置FTP服务器地址DirectoryPath获取当前工作目录UserName获取或设置FTP登录用户Password获取或设置FTP登录密码Proxy获取或设置连接FTP服务器的代理服务ErrorMsg获取操在返回的错误信息公共方法名称说明DownloadFile(string RemoteFileName, string LocalPath)从FTP服务器下载文件,使用与远程文件同名的文件名来保存文件。参数说明:RemoteFileName: 远程文件名 LocalPath: 本地路径DownloadFile(string RemoteFileName, string LocalPath, string LocalFileName)从FTP服务器下载文件,指定本地路径和本地文件名。参数说明:LocalPath: 本地路径LocalFilePath: 保存文件的本地路径,后面带有LocalFileName: 保存本地的文件名DownloadFile(string RemoteFileName)从FTP服务器下载文件,返回文件二进制数据。参数说明:RemoteFileName: 远程文件名DownloadFileAsync(string RemoteFileName, string LocalPath, string LocalFileName)从FTP服务器异步下载文件,指定本地路径和本地文件名。参数说明:RemoteFileName: 远程文件名LocalPath: 保存文件的本地路径,后面带有LocalFileName: 保存本地的文件名DownloadFileAsync(string RemoteFileName, string LocalFullPath)从FTP服务器异步下载文件,指定本地完整路径文件名。参数说明:RemoteFileName: 远程文件名LocalFullPath: 本地完整路径文件名UploadFile(string LocalFullPath)上传文件到FTP服务器。参数说明:LocalFullPath: 本地带有完整路径的文件名UploadFile(string LocalFullPath, bool OverWriteRemoteFile)上传文件到FTP服务器。参数说明:LocalFullPath: 本地带有完整路径的文件OverWriteRemoteFile: 是否覆盖远程服务器上面同名的文件UploadFile(string LocalFullPath, string RemoteFileName)上传文件到FTP服务器。参数说明:LocalFullPath: 本地带有完整路径的文件RemoteFileName: 要在FTP服务器上面保存文件名UploadFile(string LocalFullPath, string RemoteFileName, bool OverWriteRemoteFile)上传文件到FTP服务器。参数说明:LocalFullPath: 本地带有完整路径的文件名RemoteFileName: 要在FTP服务器上面保存文件名OverWriteRemoteFile: 是否覆盖远程服务器上面同名的文件UploadFile(byte FileBytes, string RemoteFileName)上传文件到FTP服务器。参数说明:FileBytes: 上传的二进制数据RemoteFileName: 要在FTP服务器上面保存文件名UploadFile(byte FileBytes, string RemoteFileName, bool OverWriteRemoteFile)上传文件到FTP服务器。参数说明:FileBytes: 文件二进制内容RemoteFileName: 要在FTP服务器上面保存文件名OverWriteRemoteFile: 是否覆盖远程服务器上面同名的文件UploadFileAsync(string LocalFullPath)异步上传文件到FTP服务器。参数说明:LocalFullPath: 本地带有完整路径的文件名UploadFileAsync(string LocalFullPath, bool OverWriteRemoteFile)异步上传文件到FTP服务器。参数说明:LocalFullPath: 本地带有完整路径的文件OverWriteRemoteFile: 是否覆盖远程服务器上面同名的文件UploadFileAsync(string LocalFullPath, string RemoteFileName)异步上传文件到FTP服务器。参数说明:LocalFullPath: 本地带有完整路径的文件RemoteFileName: 要在FTP服务器上面保存文件名UploadFileAsync(string LocalFullPath, string RemoteFileName, bool OverWriteRemoteFile)异步上传文件到FTP服务器。参数说明:LocalFullPath: 本地带有完整路径的文件名RemoteFileName: 要在FTP服务器上面保存文件名OverWriteRemoteFile: 是否覆盖远程服务器上面同名的文件UploadFileAsync(byte FileBytes, string RemoteFileName)异步上传文件到FTP服务器。参数说明:FileBytes: 上传的二进制数据RemoteFileName: 要在FTP服务器上面保存文件名UploadFileAsync(byte FileBytes, string RemoteFileName, bool OverWriteRemoteFile)异步上传文件到FTP服务器。参数说明:FileBytes: 文件二进制内容RemoteFileName: 要在FTP服务器上面保存文件名OverWriteRemoteFile: 是否覆盖远程服务器上面同名的文件ListFilesAndDirectories()列出FTP服务器上面当前目录的所有文件和目录。ListFiles()列出FTP服务器上面当前目录的所有文件。ListDirectories()列出FTP服务器上面当前目录的所有的目录。DirectoryExist(string RemoteDirectoryName)判断当前目录下指定的子目录是否存在。参数说明:RemoteDirectoryName: 指定的目录名FileExist(string RemoteFileName)判断一个远程文件是否存在服务器当前目录下面。参数说明:RemoteFileName: 远程文件名DeleteFile(string RemoteFileName)从FTP服务器上面删除一个文件。参数说明:RemoteFileName: 远程文件名ReName(string RemoteFileName, string NewFileName)更改一个文件的名称或一个目录的名称。参数说明:RemoteFileName: 原始文件或目录名称NewFileName: 新的文件或目录的名称CopyFileToAnotherDirectory(string RemoteFile, string DirectoryName)把当前目录下面的一个文件拷贝到服务器上面另外的目录中,注意,拷贝文件之后,当前工作目录还是文件原来所在的目录。参数说明:RemoteFile: 当前目录下的文件名DirectoryName: 新目录名称。说明:如果新目录是当前目录的子目录,则直接指定子目录。如: SubDirectory1/SubDirectory2 ;如果新目录不是当前目录的子目录,则必须从根目录一级一级的指定。如:./NewDirectory/SubDirectory1/SubDirectory2MoveFileToAnotherDirectory(string RemoteFile, string DirectoryName)把当前目录下面的一个文件移动到服务器上面另外的目录中,注意,移动文件之后,当前工作目录还是文件原来所在的目录。参数说明:RemoteFile: 当前目录下的文件名DirectoryName: 新目录名称。说明:如果新目录是当前目录的子目录,则直接指定子目录。如: SubDirectory1/SubDirectory2 ;如果新目录不是当前目录的子目录,则必须从根目录一级一级的指定。如:./NewDirectory/SubDirectory1/SubDirectory2MakeDirectory(string DirectoryName)在FTP服务器上当前工作目录建立一个子目录。参数说明:DirectoryName: 子目录名称RemoveDirectory(string DirectoryName)从当前工作目录中删除一个子目录。参数说明:DirectoryName: 子目录名称IsValidPathChars(string DirectoryName)判断目录名中字符是否合法。参数说明:DirectoryName: 目录名称IsValidFileChars(string FileName)判断文件名中字符是否合法。参数说明:FileName: 文件名称GotoDirectory(string DirectoryName)进入一个目录。参数说明:DirectoryName: 新目录的名字。说明:如果新目录是当前目录的子目录,则直接指定子目录。如: SubDirectory1/SubDirectory2 ;如果新目录不是当前目录的子目录,则必须从根目录一级一级的指定。如:./NewDirectory/SubDirectory1/SubDirectory2EnterOneSubDirectory(string DirectoryName)从当前工作目录进入一个子目录。参数说明:DirectoryName: 子目录名称ComeoutDirectory()从当前工作目录往上一级目录。公共事件名称说明DownloadProgressChanged异步下载进度发生改变触发的事件DownloadDataCompleted异步下载文件完成之后触发的事件UploadProgressChanged异步上传进度发生改变触发的事件UploadFileCompleted异步上传文件完成之后触发的事件其他说明序号说明1支持代理服务器。可以显式地给Proxy属性赋值;也可以在构造函数中传递Proxy对象。如果代理需要登录用户和密码,则设置Proxy的Credentials属性,例如:Proxy.Credentials = new NetworkCredential(UserName, Password)如果没有代理,则无需给Proxy属性赋值或者在构造函数中无需传递Proxy参数。2下载文件和上传文件大小最大受Int32.MaxValue限制,所以最大处理只能是2,147,483,647字节。如果您想处理更大的文件,请自己修改代码中对文件打开和读写操作部分的代码使其适应您的要求。3只有在异步上传文件或者异步下载文件的时候,才支持进度百分比触发事件和下载(上传)完成事件。4由于服务器未发送文件大小,因此被动 FTP 文件传输总是将进度百分比显示为零。若要显示进度,可以通过重写 url=ms-help:/MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref10/html/M_System_Net_WebClient_GetWebRequest_1_de465cc1.htmGetWebRequest/url 虚拟方法来将 FTP 连接更改为活动状态。所以,我们在clsFTP类中另外使用内部类MyWebClient5在列出文件和目录的时候,clsFTP类区分出了所获得的响应数据哪些是文件,哪些是目录。同时,考虑到了FTP服务器上面目录样式为MS DOS和UNIX两种表现形式的不同。6支持在FTP服务器上面不同目录之间移动文件和拷贝文件的功能。移动文件的方法比较巧妙,只是拷贝文件所使用的方法不太理想。全部源码:using System;using System.Net;using System.IO;using System.Text;using System.Net.Sockets;/ / FTPC 的摘要说明。/ public class FTPC #region 构造函数 / / 缺省构造函数 / public FTPC() strRemoteHost = ; strRemotePath = ; strRemoteUser = ; strRemotePass = ; strRemotePort = 21; bConnected = false; / / 构造函数 / / / / / / public FTPC(string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort) try strRemoteHost = remoteHost; strRemotePath = remotePath; strRemoteUser = remoteUser; strRemotePass = remotePass; strRemotePort = remotePort; Connect(); catch (Exception ex) throw ex; #endregion #region 登陆 / / FTP服务器IP地址 / private string strRemoteHost; public string RemoteHost get return strRemoteHost; set strRemoteHost = value; / / FTP服务器端口 / private int strRemotePort; public int RemotePort get return strRemotePort; set strRemotePort = value; / / 当前服务器目录 / private string strRemotePath; public string RemotePath get return strRemotePath; set strRemotePath = value; / / 登录用户账号 / private string strRemoteUser; public string RemoteUser set strRemoteUser = value; / / 用户登录密码 / private string strRemotePass; public string RemotePass set strRemotePass = value; / / 是否登录 / private Boolean bConnected; public bool Connected get return bConnected; #endregion #region 链接 / / 建立连接 / public void Connect() try socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ep = new IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort); / 链接 try socketControl.Connect(ep); catch (Exception) throw new IOException(Couldnt connect to remote server); / 获取应答码 ReadReply(); if (iReplyCode != 220) DisConnect(); throw new IOException(strReply); / 登陆 SendCommand(USER + strRemoteUser); if (!(iReplyCode = 331 | iReplyCode = 230) CloseSocketConnect();/关闭连接 throw new IOException(strReply); if (iReplyCode != 230) SendCommand(PASS + strRemotePass); if (!(iReplyCode = 230 | iReplyCode = 202) CloseSocketConnect();/关闭连接 throw new IOException(strReply); bConnected = true; / 切换到目录 if (strRemotePath != ) ChDir(strRemotePath); catch(Exception ex) throw ex; / / 关闭连接 / public void DisConnect() if (socketControl != null) SendCommand(QUIT); CloseSocketConnect(); #endregion #region 传输模式 / / 传输模式:二进制类型、ASCII类型 / public enum TransferType Binary, ASCII ; / / 设置传输模式 / / 传输模式 public void SetTransferType(TransferType ttType) if (ttType = TransferType.Binary) SendCommand(TYPE I);/binary类型传输 else SendCommand(TYPE A);/ASCII类型传输 if (iReplyCode != 200) throw new IOException(strReply); else trType = ttType; / / 获得传输模式 / / 传输模式 public TransferType GetTransferType() return trType; #endregion #region 文件操作 / / 获得文件列表 / / 文件名的匹配字符串 / public string Dir(string strMask) / 建立链接 if (!bConnected) Connect(); /建立进行数据连接的socket Socket socketData = CreateDataSocket(); /传送命令 SendCommand(NLST + strMask); /分析应答代码 /550 没有文件或目录 if (iReplyCode = 550) return new string ; if (!(iReplyCode = 150 | iReplyCode = 125 | iReplyCode = 226) throw new IOException(strReply); /获得结果 strMsg = ; DateTime timeout = DateTime.Now.AddSeconds(this.timeoutSeconds); while (timeout DateTime.Now) /while (true) int iBytes = socketData.Receive(buffer, buffer.Length, 0); strMsg += ASCII.GetString(buffer, 0, iBytes); if (iBytes buffer.Length) break; char seperator = n ; string strsFileList = strMsg.Split(seperator); socketData.Close();/数据socket关闭时也会有返回码 if (this.strMsg = ) strsFileList = new string ; if (iReplyCode != 226) ReadReply(); if (iReplyCode != 226) throw new IOException(strReply); return strsFileList; / / 获取文件大小 / / 文件名 / 文件大小 private long GetFileSize(string strFileName) if (!bConnected) Connect(); SendCommand(SIZE + Path.GetFileName(strFileName); long lSize = 0; if (iReplyCode = 213) lSize = Int64.Parse(strReply.Substring(4); else throw new IOException(strReply); return lSize; / / 删除 / / 待删除文件名 public void Delete(string strFileName) if (!bConnected) Connect(); SendCommand(DELE + strFileName); if (iReplyCode != 250) throw new IOException(strReply); / / 重命名(如果新文件名与已有文件重名,将覆盖已有文件) / / 旧文件名 / 新文件名 public void Rename(string strOldFileName, string strNewFileName) if (!bConnected) Connect(); SendCommand(RNFR + strOldFileName); if (iReplyCode != 350) throw new IOException(strReply); / 如果新文件名与原有文件重名,将覆盖原有文件 SendCommand(RNTO + strNewFileName); if (iReplyCode != 250) throw new IOException(strReply); #endregion #region 上传和下载 / / 下载一批文件 / / 文件名的匹配字符串 / 本地目录(不得以结束) public void Get(string strFileNameMask, string strFolder) if (!bConnected) Connect(); string strFiles = Dir(strFileNameMask); foreach (string strFile in strFiles) if (!strFile.Equals()/一般来说strFiles的最后一个元素可能是空字符串 Get(strFile, strFolder, strFile); / / 下载一个文件 / / 要下载的文件名 / 本地目录(不得以结束) / 保存在本地时的文件名 public void Get(string strRemoteFileName, string strFolder, string strLocalFileName) if (!bConnected) Connect(); SetTransferType(TransferType.Binary); if (strLocalFileName.Equals() strLocalFileName = strRemoteFileName; if (!File.Exists(strFolder + + strLocalFileName) Stream st = File.Create(strFolder + + strLocalFileName); st.Close(); FileStream output = new FileStream(strFolder + + strLocalFileName, FileMode.Create); Socket socketData = CreateDataSocket(); SendCommand(RETR + strRemoteFileName); if (!(iReplyCode = 150 | iReplyCode = 125 | iReplyCode = 226 | iReplyCode = 250) throw new IOException(strReply); while (true) int iBytes = socketData.Receive(buffer, buffer.Length, 0); output.Write(buffer, 0, iBytes); if (iBytes = 0) break; output.Close(); if (socketData.Connected) socketData.Close(); if (!(iReplyCode = 226 | iReplyCode = 250) ReadReply(); if (!(iReplyCode = 226 | iReplyCode = 250) throw new IOException(strReply); / / 上传一批文件 / / 本地目录(不得以结束) / 文件名匹配字符(可以包含*和?) public void Put(string strFolder, string strFileNameMask) string strFiles = Directory.GetFiles(strFolder, strFileNameMask); foreach (string strFile in strFiles) /strFile是完整的文件名(包含路径) Put(strFile); / / 上传一个

温馨提示

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

评论

0/150

提交评论