C#一个FTP操作封装类FTPHelper_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > C#一个FTP操作封装类FTPHelper

C#一个FTP操作封装类FTPHelper

 2014/4/11 15:19:11  GC2013  博客园  我要评论(0)
  • 摘要:参考了网上一些代码,作了一些调整优化。001usingSystem;002usingSystem.Collections.Generic;003usingSystem.Linq;004usingSystem.Text;005usingSystem.Net;006usingSystem.IO;007008publicclassFTPHelper009{010///<summary>011///FTP请求对象012///</summary>
  • 标签:C# 一个 操作

参考了网上一些代码,作了一些调整优化。

001 class="keyword">using System; 002 using System.Collections.Generic; 003 using System.Linq; 004 using System.Text; 005 using System.Net; 006 using System.IO; 007   008 public class FTPHelper 009 { 010     /// <summary> 011     /// FTP请求对象 012     /// </summary> 013     FtpWebRequest request = null; 014     /// <summary> 015     /// FTP响应对象 016     /// </summary> 017     FtpWebResponse response = null; 018     /// <summary> 019     /// FTP服务器地址 020     /// </summary> 021     public string ftpURI { getprivate set; } 022     /// <summary> 023     /// FTP服务器IP 024     /// </summary> 025     public string ftpServerIP { getprivate set; } 026     /// <summary> 027     /// FTP服务器默认目录 028     /// </summary> 029     public string ftpRemotePath { getprivate set; } 030     /// <summary> 031     /// FTP服务器登录用户名 032     /// </summary> 033     public string ftpUserID { getprivate set; } 034     /// <summary> 035     /// FTP服务器登录密码 036     /// </summary> 037     public string ftpPassword { getprivate set; } 038   039     /// <summary>  040     /// 初始化 041     /// </summary>  042     /// <param name="FtpServerIP">FTP连接地址</param>  043     /// <param name="FtpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param>  044     /// <param name="FtpUserID">用户名</param>  045     /// <param name="FtpPassword">密码</param>  046     public FTPHelper(string ftpServerIP, string ftpRemotePath, string ftpUserID, stringftpPassword) 047     { 048         this.ftpServerIP = ftpServerIP; 049         this.ftpRemotePath = ftpRemotePath; 050         this.ftpUserID = ftpUserID; 051         this.ftpPassword = ftpPassword; 052         this.ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/"; 053     } 054     ~FTPHelper() 055     { 056         if (response != null) 057         { 058             response.Close(); 059             response = null; 060         } 061         if (request != null) 062         { 063             request.Abort(); 064             request = null; 065         } 066     } 067     /// <summary> 068     /// 建立FTP链接,返回响应对象 069     /// </summary> 070     /// <param name="uri">FTP地址</param> 071     /// <param name="ftpMethod">操作命令</param> 072     /// <returns></returns> 073     private FtpWebResponse Open(Uri uri, string ftpMethod) 074     { 075         request = (FtpWebRequest)FtpWebRequest.Create(uri); 076         request.Method = ftpMethod; 077         request.UseBinary = true; 078         request.KeepAlive = false; 079         request.Credentials = new NetworkCredential(this.ftpUserID, this.ftpPassword); 080         return (FtpWebResponse)request.GetResponse(); 081     } 082   083     /// <summary>       084     /// 建立FTP链接,返回请求对象       085     /// </summary>      086     /// <param name="uri">FTP地址</param>       087     /// <param name="ftpMethod">操作命令</param>       088     private FtpWebRequest OpenRequest(Uri uri, string ftpMethod) 089     { 090         request = (FtpWebRequest)WebRequest.Create(uri); 091         request.Method = ftpMethod; 092         request.UseBinary = true; 093         request.KeepAlive = false; 094         request.Credentials = new NetworkCredential(this.ftpUserID, this.ftpPassword); 095         return request; 096     } 097     /// <summary> 098     /// 创建目录 099     /// </summary> 100     /// <param name="remoteDirectoryName">目录名</param> 101     public void CreateDirectory(string remoteDirectoryName) 102     { 103         response = Open(newUri(ftpURI + remoteDirectoryName), WebRequestMethods.Ftp.MakeDirectory); 104     } 105     /// <summary> 106     /// 更改目录或文件名 107     /// </summary> 108     /// <param name="currentName">当前名称</param> 109     /// <param name="newName">修改后新名称</param> 110     public void ReName(string currentName, string newName) 111     { 112         request = OpenRequest(newUri(ftpURI + currentName), WebRequestMethods.Ftp.Rename); 113         request.RenameTo = newName; 114         response = (FtpWebResponse)request.GetResponse(); 115     }   116     /// <summary>  117     /// 切换当前目录  118     /// </summary>  119     /// <param name="IsRoot">true:绝对路径 false:相对路径</param>   120     public void GotoDirectory(string DirectoryName, bool IsRoot) 121     { 122         if (IsRoot) 123             ftpRemotePath = DirectoryName; 124         else 125             ftpRemotePath += "/" + DirectoryName; 126   127         ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/"; 128     }       129     /// <summary> 130     /// 删除目录(包括下面所有子目录和子文件) 131     /// </summary> 132     /// <param name="remoteDirectoryName">要删除的带路径目录名:如web/test</param> 133     /* 134      * 例:删除test目录 135      FTPHelper helper = new FTPHelper("x.x.x.x", "web", "user", "password");                  136      helper.RemoveDirectory("web/test"); 137      */ 138     public void RemoveDirectory(string remoteDirectoryName) 139     { 140         GotoDirectory(remoteDirectoryName, true); 141         var listAll = ListFilesAndDirectories(); 142         foreach (var m in listAll) 143         { 144             if(m.IsDirectory)           145                 RemoveDirectory(m.Path);           146             else           147                 DeleteFile(m.Name);           148         } 149         GotoDirectory(remoteDirectoryName, true); 150         response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.RemoveDirectory); 151     } 152     /// <summary> 153     /// 文件上传 154     /// </summary> 155     /// <param name="localFilePath">本地文件路径</param> 156     public void Upload(string localFilePath) 157     { 158         FileInfo fileInf = new FileInfo(localFilePath); 159         request = OpenRequest(newUri(ftpURI + fileInf.Name), WebRequestMethods.Ftp.UploadFile); 160         request.ContentLength = fileInf.Length; 161         int buffLength = 2048; 162         byte[] buff = new byte[buffLength]; 163         int contentLen; 164         using (var fs = fileInf.OpenRead()) 165         { 166             using (var strm = request.GetRequestStream()) 167             { 168                 contentLen = fs.Read(buff, 0, buffLength); 169                 while (contentLen != 0) 170                 { 171                     strm.Write(buff, 0, contentLen); 172                     contentLen = fs.Read(buff, 0, buffLength); 173                 } 174             } 175         } 176     } 177     /// <summary>  178     /// 删除文件  179     /// </summary>  180     /// <param name="remoteFileName">要删除的文件名</param> 181     public void DeleteFile(string remoteFileName) 182     { 183         response = Open(newUri(ftpURI + remoteFileName), WebRequestMethods.Ftp.DeleteFile); 184     } 185   186     /// <summary> 187     /// 获取当前目录的文件和一级子目录信息 188     /// </summary> 189     /// <returns></returns> 190     public List<FileStruct> ListFilesAndDirectories() 191     { 192         var fileList = new List<FileStruct>(); 193         response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.ListDirectoryDetails); 194         using (var stream = response.GetResponseStream()) 195         { 196             using (var sr = new StreamReader(stream)) 197             { 198                 string line = null; 199                 while ((line = sr.ReadLine()) != null) 200                 { 201                     //line的格式如下: 202                     //08-18-13  11:05PM       <DIR>          aspnet_client 203                     //09-22-13  11:39PM                 2946 Default.aspx 204                     DateTime dtDate = DateTime.ParseExact(line.Substring(0, 8), "MM-dd-yy"null); 205                     DateTime dtDateTime = DateTime.Parse(dtDate.ToString("yyyy-MM-dd") + line.Substring(8, 9)); 206                     string[] arrs = line.Split(' '); 207                     var model = new FileStruct() 208                     { 209                         IsDirectory = line.IndexOf("<DIR>") > 0 ? true false, 210                         CreateTime = dtDateTime, 211                         Name = arrs[arrs.Length - 1], 212                         Path = ftpRemotePath + "/" + arrs[arrs.Length - 1] 213                     }; 214                     fileList.Add(model); 215                 } 216             } 217         } 218         return fileList; 219     } 220     /// <summary>       221     /// 列出当前目录的所有文件       222     /// </summary>       223     public List<FileStruct> ListFiles() 224     { 225         var listAll = ListFilesAndDirectories(); 226         var listFile = listAll.Where(m => m.IsDirectory == false).ToList(); 227         return listFile; 228     } 229     /// <summary>       230     /// 列出当前目录的所有一级子目录       231     /// </summary>       232     public List<FileStruct> ListDirectories() 233     { 234         var listAll = ListFilesAndDirectories(); 235         var listFile = listAll.Where(m => m.IsDirectory == true).ToList(); 236         return listFile; 237     } 238     /// <summary>       239     /// 判断当前目录下指定的子目录或文件是否存在       240     /// </summary>       241     /// <param name="remoteName">指定的目录或文件名</param>      242     public bool IsExist(string remoteName) 243     { 244         var list = ListFilesAndDirectories(); 245         if (list.Count(m => m.Name == remoteName) > 0) 246             return true; 247         return false; 248     } 249     /// <summary>       250     /// 判断当前目录下指定的一级子目录是否存在       251     /// </summary>       252     /// <param name="RemoteDirectoryName">指定的目录名</param>      253     public bool IsDirectoryExist(string remoteDirectoryName) 254     { 255         var listDir = ListDirectories(); 256         if (listDir.Count(m => m.Name == remoteDirectoryName) > 0) 257             return true; 258         return false; 259     } 260     /// <summary>       261     /// 判断当前目录下指定的子文件是否存在      262     /// </summary>       263     /// <param name="RemoteFileName">远程文件名</param>       264     public bool IsFileExist(string remoteFileName) 265     { 266         var listFile = ListFiles(); 267         if (listFile.Count(m => m.Name == remoteFileName) > 0) 268             return true; 269         return false; 270     } 271   272     /// <summary> 273     /// 下载 274     /// </summary> 275     /// <param name="saveFilePath">下载后的保存路径</param> 276     /// <param name="downloadFileName">要下载的文件名</param> 277     public void Download(string saveFilePath, string downloadFileName) 278     { 279         using (FileStream outputStream = new FileStream(saveFilePath + "\\"+ downloadFileName, FileMode.Create)) 280         { 281             response = Open(newUri(ftpURI + downloadFileName), WebRequestMethods.Ftp.DownloadFile); 282             using (Stream ftpStream = response.GetResponseStream()) 283             { 284                 long cl = response.ContentLength; 285                 int bufferSize = 2048; 286                 int readCount; 287                 byte[] buffer = new byte[bufferSize]; 288                 readCount = ftpStream.Read(buffer, 0, bufferSize); 289                 while (readCount > 0) 290                 { 291                     outputStream.Write(buffer, 0, readCount); 292                     readCount = ftpStream.Read(buffer, 0, bufferSize); 293                 } 294             } 295         } 296     } 297   298      299 } 300   301 public class FileStruct 302 { 303     /// <summary> 304     /// 是否为目录 305     /// </summary> 306     public bool IsDirectory { getset; } 307     /// <summary> 308     /// 创建时间 309     /// </summary> 310     public DateTime CreateTime { getset; } 311     /// <summary> 312     /// 文件或目录名称 313     /// </summary> 314     public string Name { getset; } 315     /// <summary> 316     /// 路径 317     /// </summary> 318     public string Path { getset; } 319 }
发表评论
用户名: 匿名