编译真难 发表于 2013-1-2 23:04:23

关于ftp的功能类——下载,上传,断点,连接

关于ftp的功能类——下载,上传,断点,连接

<div id="cnblogs_post_body">看到园子里有几篇关于c#连接ftp的文章,刚好最近刚刚完成对于这个的书写,就发出来给大家分享分享下。不会排版,第一次发,就直接贴代码了
<div class="cnblogs_code" >http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gifhttp://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gifView Code <div id="cnblogs_code_open_4f3eb2b7-18a9-4059-adeb-b8c83828b06d" class="cnblogs_code_hide">1 using System;2 using System.Collections.Generic;3 using System.Text;4 using System.Configuration;5 using System.Net;6 using System.IO;7 8 namespace MirroringDownClass9 { 10   public class EasyononFtp 11     { 12         publicdelegate void delegt(string s); 13         public static event delegt onprogressBar; 14         #region 成员 15          16       17         private static string ftpServer ;//ftp服务器地址 18         private static string user;//用户名 19         private static string pwd;//密码 20         #endregion 21 22       FtpWebRequest reqFTP; 23       FtpWebResponse ftpResponse; 24         #region 构造函数 25          26         public EasyononFtp() 27       { 28       } 29         public EasyononFtp(string ftpUri, string username, string password) 30       { 31             ftpServer = ftpUri; 32             user = username; 33             pwd = password; 34       } 35 36         #endregion 37         #region FTP连接 38          39         /// <summary> 40         /// Ftp的连接 41         /// </summary> 42         /// <param name="url">ftp的地址</param> 43         /// <returns>bool</returns> 44         publicbool ftpconn() 45       { 46             try 47             { 48               reqFTP = getFTPwbRequest(ftpServer, WebRequestMethods.Ftp.ListDirectoryDetails); 49               ftpResponse = (FtpWebResponse)reqFTP.GetResponse(); 50               return true; 51             } 52             catch (Exception ex) 53             { 54                 Common.debugPrint(ex.Message.ToString()); 55             } 56             finally 57             { 58               if (ftpResponse != null) 59                 { 60                   ftpResponse.Close(); 61                 } 62             } 63             return false; 64       } 65         #endregion 66         #region 下载FTP文件函数 67      /// <summary> 68         /// 下载 69      /// </summary> 70      /// <param name="desfilePath">本地文件目录</param> 71      /// <param name="ftpfilePath">FTP服务器文件目录</param> 72      /// <param name="fileName">带相对路径的文件名</param> 73      /// <returns></returns> 74         public bool ftpGetFile(string desfilePath, string ftpfilePath, string fileName) 75       { 76             string Relative_path = fileName.Replace("\\", "/"); 77             string filenamepath = ftpfilePath + "/" + Relative_path; 78             try 79             { 80               if (ftpconn()) 81                 { 82                     Common.debugPrint(filenamepath + "下载中"); 83                     reqFTP = getFTPwbRequest(filenamepath, WebRequestMethods.Ftp.DownloadFile); 84                     FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); 85                     Stream ftpStream = response.GetResponseStream();//FTP数据流 86                     if (outputStream(desfilePath + "\\" + fileName, ftpStream))//字符流处理方法 87                   { 88                         ftpStream.Close(); 89                         response.Close(); 90                         Common.debugPrint(filenamepath + "下载完成!!!"); 91                         return true; 92                   } 93                     else 94                         return false; 95                 } 96               else 97                 { 98                     Common.debugPrint("ftpconn()连接失败"); 99                     return false;100                 }101             }102             catch (Exception ex)103             {104               Common.debugPrint(ex.Message.ToString() + "查看ftpGetFile函数");105               return false;106             }107       }108         #endregion109         #region 重写FTP下载函数110       /// <summary>111         /// 重写下载方法112       /// </summary>113       /// <param name="localFile">本地文件全路径</param>114       /// <param name="ftpFile">ftp服务器文件全路径</param>115       /// <returns></returns>116         public bool ftpGetFile(string localFile, string ftpFile)117       {118             try119             {120               if (ftpconn())121                 {122                     reqFTP = getFTPwbRequest(ftpFile, WebRequestMethods.Ftp.DownloadFile);123                     FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();124                     Stream ftpStream = response.GetResponseStream();125                     if (outputStream(localFile, ftpStream))//字符流处理方法126                   {127                         ftpStream.Close();128                         response.Close();129                         return true;130                   }131                     else132                   {133                         ftpStream.Close();134                         response.Close();135                         return false;136                   }137                 }138               else139                 {140                     Common.debugPrint("ftpconn()连接失败");141                     return false;142                 }143               144             }145             catch (Exception ex)146             {147                 Common.debugPrint(ex.Message.ToString());148               return false;149             }150       }151      #endregion152         #region 断点续传153         154         155         /// <summary>156         /// 断点续传(下载)157         /// </summary>158         /// <param name="localFile">本地文件路径</param>159         /// <param name="ftpFile">FTP文件路径</param>160         /// <returns>bool</returns>161         public bool ftpGetBrokenFile(string localFile, string ftpFile)162       {163             try164             {165               if (File.Exists(localFile))166                 {167                     FileInfo fileinfo = new FileInfo(localFile);168                     long leng = fileinfo.Length;169                     if (ftpconn())170                   {171                         if (leng < GetftpFilesLength(ftpFile) && leng < 1024 * 10000)172                         {173                           File.Delete(localFile);//删除重传174                           Common.debugPrint(localFile + "删除重传");175                           return ftpGetFile(localFile, ftpFile);//调用ftpGetFile176                         }177                         else// 断点续传                                                   178                         {179                           reqFTP = getFTPwbRequest(ftpFile, WebRequestMethods.Ftp.DownloadFile);180                           reqFTP.ContentOffset = leng;181                           FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();182                           Stream ftpStream = response.GetResponseStream();183                           if (outputStream(localFile, ftpStream))//字符流处理方法184                             {185                               ftpStream.Close();186                               response.Close();187                                 Common.debugPrint(localFile + "断点续传完成");188                                 return true;189                             }190                           else191                             {192                                 Common.debugPrint(localFile + "断点续传失败");193                                 return false;194                             }195                         }196                   }197                     else198                   {199                         Common.debugPrint("ftpconn()连接失败");200                         return false;201                   }202                 }203               else204                 {205                     return ftpGetFile(localFile, ftpFile);//调用ftpGetFile206                 }207             }208             catch (Exception ex)209             {210               Common.debugPrint(ex.Message.ToString()+"EasyonFtp类");211               return false;212             }213       }214         #endregion215         #region FTP上传216         /// <summary>217         ///FTP上传方法218         /// </summary>219         /// <param name="localFile">本地文件全路径</param>220         /// <param name="ftpFile">上传到ftp服务器的指定路径</param>221         /// <param name="Breakpoint">断点处</param>222         /// <returns></returns>223         public bool ftpUpload(string localFile, string ftpFile, long Breakpoint)224       {225             if (Breakpoint > 0)226             {227               reqFTP = getFTPwbRequest(ftpFile, WebRequestMethods.Ftp.AppendFile);228             }229             else230             {231               reqFTP = getFTPwbRequest(ftpFile, WebRequestMethods.Ftp.UploadFile);232             }233             FileInfo fileinfo = new FileInfo(localFile);234             Stream strm = reqFTP.GetRequestStream();235             try236             {237               // 上传文件时通知服务器文件的大小238               reqFTP.ContentLength = fileinfo.Length;239               //这里判断是否是断点续传240 241               if (inputStream(localFile, strm, Breakpoint))242                 {243                     return true;244                 }245               else246                 {247                     Common.debugPrint("outputStream处理异常");248                     return false;249                 }250             }251             catch (Exception ex)252             {253                 Common.debugPrint(ex.Message);254             }255             finally256             {257                 strm.Close();258             }259             return false;260       }261 262         /// <summary>263         /// 创建文件夹   (1J目录)264         /// </summary>265         /// <param name="ftpFile"></param>266         public bool MaikDir(string ftpFile)267       {268             FtpWebResponse response = null;269             try270             {271               string uri = ftpFile;272               //Connect(uri);//连接273               reqFTP = getFTPwbRequest(ftpFile, WebRequestMethods.Ftp.MakeDirectory);274                // reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;275                response = (FtpWebResponse)reqFTP.GetResponse();       276             }277             catch (Exception ex)278             {279               return false;280                // MessageBox.Show(ex.Message);281             }282             finally283             {284               if (response != null)285                 {286                   response.Close();287                 }288             }289             return true;290 291       }292         #endregion293         #region获取ftp上文件最后修改时间294         295         /// <summary>296         /// 获取ftp上文件最后修改时间297         /// </summary>298         /// <param name="filename"></param>299         /// <returns></returns>300         public DateTime GetftpFileslastModifiedTime(string filename)301       {302             DateTime lastmodified = new DateTime();303             try304             {305               if (ftpconn())306                 {307                     reqFTP = getFTPwbRequest(filename, WebRequestMethods.Ftp.GetDateTimestamp);308                     FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();309                     lastmodified = response.LastModified;310                   response.Close();311                 }312             }313             catch (Exception ex)314             {315               Common.debugPrint(ex.Message + "EasyonFtp类 GetftpFileslastModifiedTime()");316             }317             return lastmodified;318       }319         #endregion320         #region 获取FTP文件的长度321         322         323         public long GetftpFilesLength(string filename)324       {325             long length = 0;326             try327             {328               if (ftpconn())329                 {330                     reqFTP = getFTPwbRequest(filename, WebRequestMethods.Ftp.GetFileSize);331                     FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();332                     length = response.ContentLength;333                 }334             }335             catch (Exception ex)336             {337               Common.debugPrint(ex.Message + "EasyonFtp类 GetftpFilesLength() ");338             }339             return length;340       }341         #endregion342         #region 获取ftp目录下文件信息343 344         /// <summary>345         /// 获取ftp目录下文件和文件夹信息(只获取当前目录信息)346         /// </summary>347         /// <param name="ftpFile">ftp目录</param>348         /// <returns></returns>349         public FileStruct[] ftpListFiles(string ftpFile)350       {351         352             FileStruct[] list = null;353             try354             {355               if (ftpconn())356                 {357                     reqFTP = getFTPwbRequest(ftpFile, WebRequestMethods.Ftp.ListDirectoryDetails);358                     FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();359                     StreamReader stream = new StreamReader(response.GetResponseStream(), Encoding.Default);360                     string Datastring = stream.ReadToEnd();361                     DirectoryListParser parser = new DirectoryListParser(Datastring);362                     list = parser.FullListing;363                   response.Close();364                     //char[] seperator = { '\n' };365                     //list = Datastring.Split(seperator);366                     367                     return list;368                 }369             }370             catch (Exception ex)371             {372               Common.debugPrint(ex.Message + "EasyonFtp类 GetftpFilesLength()");373             }374             return list;375       }376         #endregion377         #region FtpWebRequest请求378379         /// <summary>380         /// 获取FtpWebRequest381         /// </summary>382         /// <param name="ftpFilepath">ftp文件/目录路径</param>383         /// <param name="Method">WebRequestMethods.Ftp.Method</param>384         /// <returns></returns>385         public FtpWebRequest getFTPwbRequest(string ftpFilepath, string Method)386       {387             try388             {389               reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpFilepath));390               reqFTP.Method = Method;391               reqFTP.KeepAlive = true;392               reqFTP.UseBinary = true;393             }394             catch (Exception ex)395             {396               Common.debugPrint(ex.Message + "EasyononFtp获取FtpWebRequest失败");397               return null;398             }399             try400             {401               reqFTP.Credentials = new NetworkCredential(user, pwd);402               403             }404             catch (Exception ex)405             {406                 Common.debugPrint(ex.Message);407             }408             return reqFTP;409 410       }411         public FtpWebRequest getFTPwbRequest1(string ftpFilepath, string Method)412       {413             try414             {415               reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpFilepath));416               reqFTP.Method = Method;417               //reqFTP.KeepAlive = true;418               reqFTP.UseBinary = true;419             }420             catch (Exception ex)421             {422               Common.debugPrint(ex.Message + "EasyononFtp获取FtpWebRequest失败");423               return null;424             }425             try426             {427               reqFTP.Credentials = new NetworkCredential(user, pwd);428 429             }430             catch (Exception ex)431             {432                 Common.debugPrint(ex.Message);433             }434             return reqFTP;435 436       }437         #endregion438         #region 下载文件流输出处理439 440         /// <summary>441         /// 下载文件流输出处理方法442         /// </summary>443         /// <param name="filePath">ftp文件路径</param>444         /// <param name="ftpStream">IO流</param>445         /// <returns></returns>446         private bool outputStream(string filePath, Stream ftpStream)447       {448             FileStream outputStream= new FileStream(filePath, FileMode.Append, FileAccess.Write);449            450             int bufferSize = 2048*1000;451 452             int readCount;453 454             byte[] buffer = new byte;455             try456             {457               readCount = ftpStream.Read(buffer, 0, bufferSize);458               while (readCount > 0)459                 {460                     outputStream.Write(buffer, 0, readCount);461                     readCount = ftpStream.Read(buffer, 0, bufferSize);462                 }463               return true;464             }465             catch (Exception ex)466             {467               Common.debugPrint(ex.Message.ToString() + "EasyononFtp类下载文件流输出处理方法异常");468               return false;469             }470             finally471             {472                 outputStream.Close();473             }474       }475         #endregion476         #region 上传文件流输出处理477      /// <summary>478         /// 上传文件流输出处理方法479      /// </summary>480      /// <param name="fileinfo">文件信息</param>481      /// <param name="ftpStream">IO流</param>482      /// <returns></returns>483         private bool inputStream(string filePath, Stream ftpStream, long Breakpoint)484       {485             486             // 打开一个文件流(System.IO.FileStream) 去读上传的文件487             FileStream outputStream = new FileStream(filePath, FileMode.Open);488             489             // 缓冲大小设置为kb490             int bufferSize = 2048 * 1000;491 492             int readCount;493 494             byte[] buffer = new byte;495             try496             {497               if (Breakpoint > 0)498                 {499                   outputStream.Seek(Breakpoint, SeekOrigin.Current);500                     501                  502                 }503               504                     readCount = outputStream.Read(buffer, 0, bufferSize);505               506               while (readCount > 0)507                 {508                     // 把内容从file stream 写入upload stream 509                     ftpStream.Write(buffer, 0, readCount);510                     readCount = outputStream.Read(buffer, 0, bufferSize);511                   512                  // 513                 }514               515               return true;516             }517             catch (Exception ex)518             {519               Common.debugPrint(ex.Message.ToString() + "上传文件流输出处理方法异常");520               return false;521             }522             finally523             {524                 outputStream.Close();525             }526       }527         #endregion528      529     }530 }
页: [1]
查看完整版本: 关于ftp的功能类——下载,上传,断点,连接