FtpHelper.cs

网上找了好多,感觉还是自己这个使用起来方便点,记录一下!

  1 using System;
  2 using System.Collections;
  3 using System.IO;
  4 using System.Linq;
  5 using System.Net;
  6 using System.Text;
  7 
  8 namespace FtpTest.Common
  9 {
 10 
 11     public class FtpHelper
 12     {
 13         private readonly string _ftpUri;  //ftp服务器地址
 14         private readonly string _ftpName;  //ftp帐户
 15         private readonly string _ftpPwd;  //ftp密码
 16         private FtpWebRequest _ftpRequest;  //请求
 17         private FtpWebResponse _ftpResponse;  //响应
 18 
 19         public FtpHelper(string uri, string name, string password)
 20         {
 21             _ftpUri = uri;
 22             _ftpName = name;
 23             _ftpPwd = password;
 24         }
 25 
 26         /// <summary>
 27         /// 连接类
 28         /// </summary>
 29         /// <param name="uri">ftp地址</param>
 30         private void Conn(string uri)
 31         {
 32             _ftpRequest = (FtpWebRequest)WebRequest.Create(uri);
 33             //登录ftp服务器,ftpName:账户名,ftpPwd:密码
 34             _ftpRequest.Credentials = new NetworkCredential(_ftpName, _ftpPwd);
 35             _ftpRequest.UseBinary = true;  //该值指定文件传输的数据类型。
 36         }
 37 
 38         /// <summary>
 39         /// 删除文件
 40         /// </summary>
 41         /// <param name="fileName">文件名</param>
 42         public void DeleteFileName(string fileName)
 43         {
 44             string uri = _ftpUri + "/" + fileName;
 45             Conn(uri);
 46             try
 47             {
 48                 _ftpRequest.Method = WebRequestMethods.Ftp.DeleteFile;
 49                 _ftpResponse = (FtpWebResponse)_ftpRequest.GetResponse();
 50                 _ftpResponse.Close();
 51             }
 52             catch (Exception)
 53             {
 54                 // ignored
 55             }
 56         }
 57 
 58         /// <summary>
 59         /// 删除ftp上目录
 60         /// </summary>
 61         /// <param name="dirName"></param>
 62         public void RemoveDir(string dirName)
 63         {
 64             string uri = _ftpUri + "/" + dirName;
 65             Conn(uri);
 66             try
 67             {
 68                 _ftpRequest.Method = WebRequestMethods.Ftp.RemoveDirectory;
 69                 _ftpResponse = (FtpWebResponse)_ftpRequest.GetResponse();
 70                 _ftpResponse.Close();
 71             }
 72             catch (Exception)
 73             {
 74                 // ignored
 75             }
 76         }
 77 
 78         /// <summary>
 79         /// 上传文件,使用FTPWebRequest、FTPWebResponse实例
 80         /// </summary>
 81         /// <param name="uri">ftp地址</param>
 82         /// <param name="fileName">文件名</param>
 83         /// <param name="fileData">文件内容</param>
 84         /// <param name="msg">传出参数,返回传输结果</param>
 85         public void UploadFile(string uri, string fileName, byte[] fileData, out string msg)
 86         {
 87             string ftpUri = uri.EndsWith("/") ? uri : uri + "/";
 88             ftpUri += fileName;
 89             //连接ftp服务器
 90             Conn(ftpUri);
 91             _ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
 92             _ftpRequest.ContentLength = fileData.Length; //上传文件时通知服务器文件的大小
 93             try
 94             {
 95                 //将文件流中的数据(byte[] fileData)写入请求流
 96                 using (Stream ftpstream = _ftpRequest.GetRequestStream())
 97                 {
 98                     ftpstream.Write(fileData, 0, fileData.Length);
 99                 }
100 
101                 _ftpResponse = (FtpWebResponse)_ftpRequest.GetResponse(); //响应
102                 msg = _ftpResponse.StatusDescription; //响应状态
103                 _ftpResponse.Close();
104             }
105             catch (Exception exp)
106             {
107                 msg = "Failed to upload:" + exp.Message;
108             }
109         }
110 
111         /// <summary>
112         /// 上传文件,使用WebClient类
113         /// </summary>
114         /// <param name="uri">ftp地址</param>
115         /// <param name="fileName">文件名</param>
116         /// <param name="fileData">文件内容</param>
117         /// <param name="msg">传出参数,输出传输结果</param>
118         public void UploadFileByWebClient(string uri, string fileName, byte[] fileData, out string msg)
119         {
120             string ftpUri = uri.EndsWith("/") ? uri : uri + "/";
121             ftpUri += fileName;
122 
123             try
124             {
125                 WebClient client = new WebClient { Credentials = new NetworkCredential(_ftpName, _ftpPwd) };
126                 //登录FTP服务
127                 client.UploadData(ftpUri, "STOR", fileData); //指定为ftp上传方式
128                 msg = "上传成功!";
129             }
130             catch (Exception exp)
131             {
132                 msg = "Failed to upload:" + exp.Message;
133             }
134         }
135 
136         /// <summary>
137         /// 下载文件,使用FTPWebRequest、FTPWebResponse实例
138         /// </summary>
139         /// <param name="uri">ftp地址</param>
140         /// <param name="destinationDir">目标文件存放地址</param>
141         /// <param name="msg">传出参数,返回传输结果</param>
142         public void DownloadFile(string uri, string destinationDir, out string msg)
143         {
144             string fileName = Path.GetFileName(uri);
145             // ReSharper disable once AssignNullToNotNullAttribute
146             string destinationPath = Path.Combine(destinationDir, fileName);
147 
148             try
149             {
150                 //连接ftp服务器
151                 Conn(uri);
152 
153                 using (FileStream outputStream = new FileStream(destinationPath, FileMode.OpenOrCreate))
154                 {
155                     using (_ftpResponse = (FtpWebResponse)_ftpRequest.GetResponse())
156                     {
157                         //将响应流中的数据写入到文件流
158                         using (Stream ftpStream = _ftpResponse.GetResponseStream())
159                         {
160                             int bufferSize = 2048;
161                             byte[] buffer = new byte[bufferSize];
162                             if (ftpStream != null)
163                             {
164                                 var readCount = ftpStream.Read(buffer, 0, bufferSize);
165                                 while (readCount > 0)
166                                 {
167                                     outputStream.Write(buffer, 0, readCount);
168                                     readCount = ftpStream.Read(buffer, 0, bufferSize);
169                                 }
170                             }
171                         }
172                         msg = _ftpResponse.StatusDescription;
173                     }
174                 }
175             }
176             catch (Exception exp)
177             {
178                 msg = "Failed to download:" + exp.Message;
179             }
180         }
181 
182         public byte[] DownloadFile()
183         {
184             try
185             {
186                 WebClient client = new WebClient { Credentials = new NetworkCredential(_ftpName, _ftpPwd) };
187                 byte[] responseData = client.DownloadData(_ftpUri);
188                 return responseData;
189             }
190             catch (Exception ex)
191             {
192                 // ReSharper disable once PossibleIntendedRethrow
193                 throw ex;
194             }
195         }
196 
197         /// <summary>
198         /// 文件下载,使用WebClient类
199         /// </summary>
200         /// <param name="uri">ftp服务地址</param>
201         /// <param name="destinationDir">存放目录</param>
202         public void DownloadFileByWebClient(string uri, string destinationDir)
203         {
204             string fileName = Path.GetFileName(uri);
205             // ReSharper disable once AssignNullToNotNullAttribute
206             string destinationPath = Path.Combine(destinationDir, fileName);
207 
208             try
209             {
210                 WebClient client = new WebClient { Credentials = new NetworkCredential(_ftpName, _ftpPwd) };
211 
212                 byte[] responseData = client.DownloadData(uri);
213 
214                 using (FileStream fileStream = new FileStream(destinationPath, FileMode.OpenOrCreate))
215                 {
216                     fileStream.Write(responseData, 0, responseData.Length);
217                 }
218             }
219             catch (Exception)
220             {
221                 // ignored
222             }
223         }
224 
225         /// <summary>
226         /// 遍历文件
227         /// </summary>
228         public ArrayList GetListDirectoryDetails()
229         {
230             ArrayList fileInfo = new ArrayList();
231             try
232             {
233                 Conn(_ftpUri);
234 
235                 //获取 FTP 服务器上的文件的详细列表的 FTP LIST 协议方法
236                 _ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
237                 try
238                 {
239                     _ftpResponse = (FtpWebResponse)_ftpRequest.GetResponse(); //响应
240                 }
241                 catch (WebException)
242                 {
243                 }
244                 catch (InvalidOperationException)
245                 {
246                 }
247 
248                 using (Stream responseStream = _ftpResponse.GetResponseStream())
249                 {
250                     // ReSharper disable once AssignNullToNotNullAttribute
251                     using (StreamReader reader = new StreamReader(responseStream))
252                     {
253                         string line = reader.ReadLine();
254                         while (line != null)
255                         {
256                             fileInfo.Add(line);
257                             line = reader.ReadLine();
258                         }
259                     }
260                 }
261             }
262             catch (Exception)
263             {
264                 // ignored
265             }
266 
267             return fileInfo;
268         }
269 
270         /// <summary>
271         /// 上传图片
272         /// </summary>
273         /// <param name="mstr"></param>
274         /// <param name="ftpUri"></param>
275         /// <returns></returns>
276         public bool Upload(MemoryStream mstr, string ftpUri)
277         {
278             try
279             {
280                 FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(ftpUri);
281                 ftp.Credentials = new NetworkCredential(_ftpName, _ftpPwd);
282                 ftp.Method = WebRequestMethods.Ftp.UploadFile;
283                 ftp.UseBinary = true;
284                 ftp.UsePassive = true;
285                 using (Stream stream = ftp.GetRequestStream())
286                 {
287                     byte[] bytes = mstr.ToArray();
288                     stream.Write(bytes, 0, bytes.Length);
289                     stream.Close();
290                     mstr.Close();
291                 }
292                 return true;
293             }
294             catch (Exception)
295             {
296                 return false;
297             }
298         }
299 
300         public bool Upload(byte[] mstr, string ftpUri)
301         {
302             try
303             {
304                 FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(ftpUri);
305                 ftp.Credentials = new NetworkCredential(_ftpName, _ftpPwd);
306                 ftp.Method = WebRequestMethods.Ftp.UploadFile;
307                 ftp.UseBinary = true;
308                 ftp.UsePassive = true;
309                 using (Stream stream = ftp.GetRequestStream())
310                 {
311                     stream.Write(mstr, 0, mstr.Length);
312                     stream.Close();
313                 }
314                 return true;
315             }
316             catch (Exception)
317             {
318                 return false;
319             }
320         }
321 
322         /// <summary>
323         /// 重命名文件
324         /// </summary>
325         /// <param name="fileName">原文件名</param>
326         /// <param name="reNameFileName">新文件名</param>
327         public bool RenameFileName(string fileName, string reNameFileName)
328         {
329             bool result = true;
330             FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(reNameFileName);
331             ftp.Credentials = new NetworkCredential(_ftpName, _ftpPwd);
332             try
333             {
334                 ftp.Method = WebRequestMethods.Ftp.Rename;
335                 ftp.RenameTo = fileName;
336                 ftp.UseBinary = true;
337                 ftp.UsePassive = true;
338                 _ftpResponse = (FtpWebResponse)ftp.GetResponse();
339                 Stream ftpStream = _ftpResponse.GetResponseStream();
340                 // ReSharper disable once PossibleNullReferenceException
341                 ftpStream.Close();
342                 _ftpResponse.Close();
343             }
344             catch (Exception)
345             {
346                 result = false;
347             }
348 
349             return result;
350         }
351 
352         /// <summary>
353         /// 删除文件
354         /// </summary>
355         /// <param name="fileName">文件名</param>
356         public bool DeleteFile(string fileName)
357         {
358             bool result = true;
359             FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(fileName);
360             ftp.Credentials = new NetworkCredential(_ftpName, _ftpPwd);
361             try
362             {
363                 ftp.Method = WebRequestMethods.Ftp.DeleteFile;
364                 ftp.UseBinary = true;
365                 ftp.UsePassive = true;
366                 _ftpResponse = (FtpWebResponse)ftp.GetResponse();
367                 Stream ftpStream = _ftpResponse.GetResponseStream();
368                 // ReSharper disable once PossibleNullReferenceException
369                 ftpStream.Close();
370                 _ftpResponse.Close();
371             }
372             catch (Exception)
373             {
374                 result = false;
375             }
376 
377             return result;
378         }
379 
380         /// <summary>
381         /// 创建目录
382         /// </summary>
383         /// <param name="dri"></param>
384         /// <returns></returns> 
385         public bool FtpMakeDir(string dri)
386         {
387             FtpWebRequest req = (FtpWebRequest)WebRequest.Create(dri);
388             req.Credentials = new NetworkCredential(_ftpName, _ftpPwd);
389             req.Method = WebRequestMethods.Ftp.MakeDirectory;
390             try
391             {
392                 FtpWebResponse response = (FtpWebResponse)req.GetResponse();
393                 response.Close();
394             }
395             catch (Exception)
396             {
397                 req.Abort();
398                 return false;
399             }
400             req.Abort();
401             return true;
402         }
403 
404         /// <summary>
405         /// 创建多级目录
406         /// </summary>
407         /// <param name="ftppath">目录,例如:/aaa/bbb/ccc </param>
408         public bool FtpMakeDirs(string ftppath)
409         {
410             string targetPath = _ftpUri;
411             var pathArray = ftppath.Split('/');
412 
413             try
414             {
415                 //遍历判断文件夹是否存在 
416                 foreach (var path in pathArray)
417                 {
418                     if (!string.IsNullOrEmpty(path.Trim()))
419                     {
420                         //不存在此层文件夹  
421                         if (!DirectoryExist(targetPath, path))
422                             FtpMakeDir(targetPath + "/" + path);
423 
424                         targetPath += "/" + path;
425                     }
426                 }
427             }
428             catch (Exception)
429             {
430                 return false;
431             }
432 
433             return true;
434         }
435 
436         /// <summary>
437         /// 下载
438         /// </summary>
439         /// <param name="fileName"></param>
440         public byte[] Download(string fileName)
441         {
442             byte[] buffer = null;
443             try
444             {
445                 // ReSharper disable once AccessToStaticMemberViaDerivedType
446                 var reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(_ftpUri + "/" + fileName));
447                 reqFtp.Method = WebRequestMethods.Ftp.DownloadFile;
448                 reqFtp.UseBinary = true;
449                 reqFtp.Credentials = new NetworkCredential(_ftpName, _ftpPwd);
450                 FtpWebResponse response = (FtpWebResponse)reqFtp.GetResponse();
451                 Stream ftpStream = response.GetResponseStream();
452                 int bufferSize = 51200; //Convert.ToInt32(GetFileSize(fileName)) + 51200;//
453                 buffer = new byte[bufferSize];
454                 // ReSharper disable once PossibleNullReferenceException
455                 var readCount = ftpStream.Read(buffer, 0, bufferSize);
456 
457                 while (readCount > 0)
458                 {
459                     readCount = ftpStream.Read(buffer, 0, bufferSize);
460                 }
461                 ftpStream.Close();
462                 response.Close();
463             }
464             catch (Exception)
465             {
466                 // ignored
467             }
468 
469             return buffer;
470         }
471 
472         /// <summary>
473         /// 获取当前目录下明细(包含文件和文件夹)
474         /// </summary>
475         /// <returns></returns>
476         public string[] GetFilesDetailList(string targetPath)
477         {
478             var tempftpUri = targetPath;
479 
480             try
481             {
482                 StringBuilder result = new StringBuilder();
483 
484                 Conn(tempftpUri);
485                 //获取 FTP 服务器上的文件的详细列表的 FTP LIST 协议方法
486                 _ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
487 
488                 WebResponse response = _ftpRequest.GetResponse();
489                 // ReSharper disable once AssignNullToNotNullAttribute
490                 StreamReader reader = new StreamReader(response.GetResponseStream());
491                 string line = reader.ReadLine();
492 
493                 while (line != null)
494                 {
495                     result.Append(line);
496                     result.Append("
");
497                     line = reader.ReadLine();
498                 }
499 
500                 result.Remove(result.ToString().LastIndexOf("
", StringComparison.Ordinal), 1);
501                 reader.Close();
502                 response.Close();
503 
504                 return result.ToString().Split('
');
505             }
506             catch (Exception)
507             {
508                 var downloadFiles = new string[] { };
509                 return downloadFiles;
510             }
511         }
512 
513         /// <summary>
514         /// 获取当前目录下所有的文件夹列表(仅文件夹)
515         /// </summary>
516         /// <returns></returns>
517         public string[] GetDirectoryList(string targetPath)
518         {
519             string[] drectory = GetFilesDetailList(targetPath);
520             string m = "";
521             if (drectory != null && true & drectory.Any())
522             {
523                 foreach (string str in drectory)
524                 {
525                     int dirPos = str.IndexOf("<DIR>", StringComparison.Ordinal);
526                     if (dirPos > 0)
527                     {
528                         /*判断 Windows 风格*/
529                         m += str.Substring(dirPos + 5).Trim() + "
";
530                     }
531                     else if (str.Trim().Substring(0, 1).ToUpper() == "D")
532                     {
533                         /*判断 Unix 风格*/
534                         string dir = str.Substring(56).Trim();
535                         if (dir != "." && dir != "..")
536                         {
537                             m += dir + "
";
538                         }
539                     }
540                 }
541             }
542             char[] n = new char[] { '
' };
543             return m.Split(n);
544         }
545 
546         /// <summary>
547         /// 判断当前目录下指定的子目录是否存在
548         /// modified at 2015/4/7 修改判断是否存在的方法,以前的方式过于臃肿,还有bug(竟然使用listdetail!)
549         /// </summary>
550         /// <param name="targetPath">服务器地址</param>
551         /// <param name="remoteDirectoryName">指定的目录名</param>
552         public bool DirectoryExist(string targetPath, string remoteDirectoryName)
553         {
554             try
555             {
556                 var uri = Path.Combine(targetPath, remoteDirectoryName).Replace(@"", @"/");
557                 Conn(uri);
558                 _ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
559 
560                 using (var response = (FtpWebResponse)_ftpRequest.GetResponse())
561                 // ReSharper disable once AssignNullToNotNullAttribute
562                 // ReSharper disable once UnusedVariable
563                 using (var stream = new StreamReader(response.GetResponseStream()))
564                 {
565                 }
566                 return true;
567             }
568             catch (Exception)
569             {
570                 // ignored
571             }
572 
573             return false;
574         }
575 
576         /// <summary>
577         /// 获取指定文件大小
578         /// </summary>
579         /// <param name="filename"></param>
580         /// <returns></returns>
581         public long GetFileSize(string filename)
582         {
583             long fileSize = 0;
584             try
585             {
586                 // ReSharper disable once AccessToStaticMemberViaDerivedType
587                 var reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(_ftpUri + "/" + filename));
588 
589                 reqFtp.Method = WebRequestMethods.Ftp.GetFileSize;
590                 reqFtp.UseBinary = true;
591                 reqFtp.Credentials = new NetworkCredential(_ftpName, _ftpPwd);
592 
593                 FtpWebResponse response = (FtpWebResponse)reqFtp.GetResponse();
594                 Stream ftpStream = response.GetResponseStream();
595                 fileSize = response.ContentLength;
596 
597                 // ReSharper disable once PossibleNullReferenceException
598                 ftpStream.Close();
599                 response.Close();
600             }
601             catch (Exception)
602             {
603                 // ignored
604             }
605 
606             return fileSize;
607         }
608 
609         /// <summary>
610         /// 获取当前目录下文件列表(仅文件)
611         /// </summary>
612         /// <returns></returns>
613         public string[] GetFileList(string mask)
614         {
615             StringBuilder result = new StringBuilder();
616             try
617             {
618                 // ReSharper disable once AccessToStaticMemberViaDerivedType
619                 var reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(_ftpUri));
620                 reqFtp.UseBinary = true;
621                 reqFtp.Credentials = new NetworkCredential(_ftpName, _ftpPwd);
622                 reqFtp.Method = WebRequestMethods.Ftp.ListDirectory;
623                 WebResponse response = reqFtp.GetResponse();
624                 // ReSharper disable once AssignNullToNotNullAttribute
625                 StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
626 
627                 string line = reader.ReadLine();
628                 while (line != null)
629                 {
630                     if (mask.Trim() != string.Empty && mask.Trim() != "*.*")
631                     {
632                         var masks = mask.Substring(0, mask.IndexOf("*", StringComparison.Ordinal));
633                         if (line.Substring(0, masks.Length) == masks)
634                         {
635                             result.Append(line);
636                             result.Append("
");
637                         }
638                     }
639                     else
640                     {
641                         result.Append(line);
642                         result.Append("
");
643                     }
644                     line = reader.ReadLine();
645                 }
646                 result.Remove(result.ToString().LastIndexOf('
'), 1);
647                 reader.Close();
648                 response.Close();
649                 return result.ToString().Split('
');
650             }
651             catch (Exception ex)
652             {
653                 if (ex.Message.Trim() != "远程服务器返回错误: (550) 文件不可用(例如,未找到文件,无法访问文件)。")
654                 {
655                 }
656                 return null;
657             }
658         }
659 
660         /// <summary>
661         /// 判断文件是否存在
662         /// </summary>
663         /// <param name="filename"></param>
664         /// <returns></returns>
665         public bool FileExist(string filename)
666         {
667             bool result;
668             WebResponse response = null;
669             try
670             {
671                 WebRequest req = WebRequest.Create(filename);
672                 response = req.GetResponse();
673                 result = true;
674             }
675             catch (Exception)
676             {
677                 result = false;
678             }
679             finally
680             {
681                 response?.Close();
682             }
683 
684             return result;
685         }
686     }
687 }

Test:

1、创建多级目录:

 1             string targetPath = "ftp://192.168.1.148/";
 2             string ftpUserName = "ftpuser";
 3             string ftpPassword = "123456";
 4             
 5             var path = "1234/1234/1234";
 6             FtpHelper ftpHelper = new FtpHelper(targetPath , ftpUserName, ftpPassword);
 7             try
 8             {
 9                 ftpHelper.FtpMakeDirs(path);
10             }
11             catch (Exception ex)
12             {
13                 Console.Write(ex.Message);
14             }
原文地址:https://www.cnblogs.com/LiuLiangXuan/p/6710070.html