swsrl 发表于 2015-5-26 12:36:56

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

  看到园子里有几篇关于c#连接ftp的文章,刚好最近刚刚完成对于这个的书写,就发出来给大家分享分享下。不会排版,第一次发,就直接贴代码了


View Code


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 MirroringDownClass
9 {
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         ///
40         /// Ftp的连接
41         ///
42         /// ftp的地址
43         /// bool
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      ///
68         /// 下载
69      ///
70      /// 本地文件目录
71      /// FTP服务器文件目录
72      /// 带相对路径的文件名
73      ///
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         #endregion
109         #region 重写FTP下载函数
110       ///
111         /// 重写下载方法
112       ///
113       /// 本地文件全路径
114       /// ftp服务器文件全路径
115       ///
116         public bool ftpGetFile(string localFile, string ftpFile)
117         {
118             try
119             {
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                     else
132                     {
133                         ftpStream.Close();
134                         response.Close();
135                         return false;
136                     }
137               }
138               else
139               {
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      #endregion
152         #region 断点续传
153         
154         
155         ///
156         /// 断点续传(下载)
157         ///
158         /// 本地文件路径
159         /// FTP文件路径
160         /// bool
161         public bool ftpGetBrokenFile(string localFile, string ftpFile)
162         {
163             try
164             {
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);//调用ftpGetFile
176                         }
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                           else
191                           {
192                                 Common.debugPrint(localFile + "断点续传失败");
193                                 return false;
194                           }
195                         }
196                     }
197                     else
198                     {
199                         Common.debugPrint("ftpconn()连接失败");
200                         return false;
201                     }
202               }
203               else
204               {
205                     return ftpGetFile(localFile, ftpFile);//调用ftpGetFile
206               }
207             }
208             catch (Exception ex)
209             {
210               Common.debugPrint(ex.Message.ToString()+"EasyonFtp类");
211               return false;
212             }
213         }
214         #endregion
215         #region FTP上传
216         ///
217         ///FTP上传方法
218         ///
219         /// 本地文件全路径
220         /// 上传到ftp服务器的指定路径
221         /// 断点处
222         ///
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             else
230             {
231               reqFTP = getFTPwbRequest(ftpFile, WebRequestMethods.Ftp.UploadFile);
232             }
233             FileInfo fileinfo = new FileInfo(localFile);
234             Stream strm = reqFTP.GetRequestStream();
235             try
236             {
237               // 上传文件时通知服务器文件的大小
238               reqFTP.ContentLength = fileinfo.Length;
239               //这里判断是否是断点续传
240
241               if (inputStream(localFile, strm, Breakpoint))
242               {
243                     return true;
244               }
245               else
246               {
247                     Common.debugPrint("outputStream处理异常");
248                     return false;
249               }
250             }
251             catch (Exception ex)
252             {
253               Common.debugPrint(ex.Message);
254             }
255             finally
256             {
257               strm.Close();
258             }
259             return false;
260         }
261
262         ///
263         /// 创建文件夹   (1J目录)
264         ///
265         ///
266         public bool MaikDir(string ftpFile)
267         {
268             FtpWebResponse response = null;
269             try
270             {
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             finally
283             {
284               if (response != null)
285               {
286                     response.Close();
287               }
288             }
289             return true;
290
291         }
292         #endregion
293         #region获取ftp上文件最后修改时间
294         
295         ///
296         /// 获取ftp上文件最后修改时间
297         ///
298         ///
299         ///
300         public DateTime GetftpFileslastModifiedTime(string filename)
301         {
302             DateTime lastmodified = new DateTime();
303             try
304             {
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         #endregion
320         #region 获取FTP文件的长度
321         
322         
323         public long GetftpFilesLength(string filename)
324         {
325             long length = 0;
326             try
327             {
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         #endregion
342         #region 获取ftp目录下文件信息
343
344         ///
345         /// 获取ftp目录下文件和文件夹信息(只获取当前目录信息)
346         ///
347         /// ftp目录
348         ///
349         public FileStruct[] ftpListFiles(string ftpFile)
350         {
351         
352             FileStruct[] list = null;
353             try
354             {
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         #endregion
377         #region FtpWebRequest请求
378
379         ///
380         /// 获取FtpWebRequest
381         ///
382         /// ftp文件/目录路径
383         /// WebRequestMethods.Ftp.Method
384         ///
385         public FtpWebRequest getFTPwbRequest(string ftpFilepath, string Method)
386         {
387             try
388             {
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             try
400             {
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             try
414             {
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             try
426             {
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         #endregion
438         #region 下载文件流输出处理
439
440         ///
441         /// 下载文件流输出处理方法
442         ///
443         /// ftp文件路径
444         /// IO流
445         ///
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             try
456             {
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             finally
471             {
472               outputStream.Close();
473             }
474         }
475         #endregion
476         #region 上传文件流输出处理
477      ///
478         /// 上传文件流输出处理方法
479      ///
480      /// 文件信息
481      /// IO流
482      ///
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             // 缓冲大小设置为kb
490             int bufferSize = 2048 * 1000;
491
492             int readCount;
493
494             byte[] buffer = new byte;
495             try
496             {
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             finally
523             {
524               outputStream.Close();
525             }
526         }
527         #endregion
528      
529   }
530 }
  如果有哪位大大能给排本提供帮助,在园子逛的也蛮久了,发现很多都排的挺漂亮的。
页: [1]
查看完整版本: 关于ftp的功能类——下载,上传,断点,连接