ftp操作方法整理

摘要:
添加一个委托以便于控制异常输出2。要删除ftp,您需要递归查找所有目录并将其存储在列表中,然后根据级别从最后一级开始按相反顺序排序。3.其他整个目录操作与1UsingSystem相同;2使用System.Collections。通用的3使用系统。Linq;4使用系统。网5使用系统。IO;67namespaceMyStuday8{9///10///ftp帮助类11/////12公共类FtpHelper13{14privateprintftpHostIP{get;}15privatestringsername{get;set;}16privatestringpassword{get;set;}17privatestringftpURI{get{return$@“ftp://{ftpHostIP}/”;}}1819///<summary>20///初始化ftp参数21///</summary>22///<paramname=“ftpHostIP”>ftp主机IP</param>23///<paramname=“username”>ftp帐户</param=24///<aramname=“password”>ftp密码</param<25publicFtpHelper26{27this.ftpHostIP=ftpHostIP;28this.username=用户名;29this.password=密码;30}3132///<汇总>33///异常方法委派,通过Lamda委托统一处理异常,可以方便地重写34///35////当前执行的方法36////37///38 privatepoolMethodInvoke39{40if(action!

1.整理简化了下C#的ftp操作,方便使用

   1.支持创建多级目录

   2.批量删除

   3.整个目录上传

   4.整个目录删除

   5.整个目录下载

2.调用方法展示,

            var ftp = new FtpHelper("10.136.12.11", "qdx1213123", "123ddddf");//初始化ftp,创建ftp对象
            ftp.DelAll("test");//删除ftptest目录及其目录下的所有文件
            ftp.UploadAllFile("F:\test\wms.zip");//上传单个文件到指定目录
            ftp.UploadAllFile("F:\test");//将本地test目录的所有文件上传
            ftp.DownloadFile("test\wms.zip", "F:\test1");//下载单个目录
            ftp.DownloadAllFile("test", "F:\test1");//批量下载整个目录
            ftp.MakeDir("aaa\bbb\ccc\ddd");//创建多级目录

3.FtpHelper 代码。

  1.异常方法委托,通过Lamda委托统一处理异常,方便改写。加了个委托方便控制异常输出

  2.ftp的删除需要递归查找所有目录存入list,然后根据 level倒序排序,从最末级开始遍历删除

  3.其他的整个目录操作都是同上

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Net;
  5 using System.IO;
  6 
  7 namespace MyStuday
  8 {
  9     /// <summary>
 10     /// ftp帮助类
 11     /// </summary>
 12     public class FtpHelper
 13     {
 14         private string ftpHostIP { get; set; }
 15         private string username { get; set; }
 16         private string password { get; set; }
 17         private string ftpURI { get { return $@"ftp://{ftpHostIP}/"; } }
 18 
 19         /// <summary>
 20         /// 初始化ftp参数
 21         /// </summary>
 22         /// <param name="ftpHostIP">ftp主机IP</param>
 23         /// <param name="username">ftp账户</param>
 24         /// <param name="password">ftp密码</param>
 25         public FtpHelper(string ftpHostIP, string username, string password)
 26         {
 27             this.ftpHostIP = ftpHostIP;
 28             this.username = username;
 29             this.password = password;
 30         }
 31 
 32         /// <summary>
 33         /// 异常方法委托,通过Lamda委托统一处理异常,方便改写
 34         /// </summary>
 35         /// <param name="method">当前执行的方法</param>
 36         /// <param name="action"></param>
 37         /// <returns></returns>
 38         private bool MethodInvoke(string method, Action action)
 39         {
 40             if (action != null)
 41             {
 42                 try
 43                 {
 44                     action();
 45                     //Logger.Write2File($@"FtpHelper.{method}:执行成功");
 46                     FluentConsole.Magenta.Line($@"FtpHelper({ftpHostIP},{username},{password}).{method}:执行成功");
 47                     return true;
 48                 }
 49                 catch (Exception ex)
 50                 {
 51                     FluentConsole.Red.Line($@"FtpHelper({ftpHostIP},{username},{password}).{method}:执行失败:
 {ex}");
 52                     // Logger.Write2File(FtpHelper({ftpHostIP},{username},{password}).{method}:执行失败 
{ex}");
 53                     return false;
 54                 }
 55             }
 56             else
 57             {
 58                 return false;
 59             }
 60         }
 61 
 62         /// <summary>
 63         /// 异常方法委托,通过Lamda委托统一处理异常,方便改写
 64         /// </summary>
 65         /// </summary>
 66         /// <typeparam name="T"></typeparam>
 67         /// <param name="method"></param>
 68         /// <param name="func"></param>
 69         /// <returns></returns>
 70         private T MethodInvoke<T>(string method, Func<T> func)
 71         {
 72             if (func != null)
 73             {
 74                 try
 75                 {
 76                     //FluentConsole.Magenta.Line($@"FtpHelper({ftpHostIP},{username},{password}).{method}:执行成功");
 77                     //Logger.Write2File($@"FtpHelper({ftpHostIP},{username},{password}).{method}:执行成功");
 78                     return func();
 79                 }
 80                 catch (Exception ex)
 81                 {
 82                     //FluentConsole.Red.Line($@"FtpHelper({ftpHostIP},{username},{password}).{method}:执行失败:").Line(ex);
 83                     // Logger.Write2File($@"FtpHelper({ftpHostIP},{username},{password}).{method}:执行失败 
{ex}");
 84                     return default(T);
 85                 }
 86             }
 87             else
 88             {
 89                 return default(T);
 90             }
 91         }
 92         private FtpWebRequest GetRequest(string URI)
 93         {
 94             //根据服务器信息FtpWebRequest创建类的对象
 95             FtpWebRequest result = (FtpWebRequest)WebRequest.Create(URI);
 96             result.Credentials = new NetworkCredential(username, password);
 97             result.KeepAlive = false;
 98             result.UsePassive = false;
 99             result.UseBinary = true;
100             return result;
101         }
102 
103         /// <summary> 上传文件</summary>
104         /// <param name="filePath">需要上传的文件路径</param>
105         /// <param name="dirName">目标路径</param>
106         public bool UploadFile(string filePath, string dirName = "")
107         {
108             FileInfo fileInfo = new FileInfo(filePath);
109             if (dirName != "") MakeDir(dirName);//检查文件目录,不存在就自动创建
110             string uri = Path.Combine(ftpURI, dirName, fileInfo.Name);
111             return MethodInvoke($@"uploadFile({filePath},{dirName})", () =>
112             {
113                 FtpWebRequest ftp = GetRequest(uri);
114                 ftp.Method = WebRequestMethods.Ftp.UploadFile;
115                 ftp.ContentLength = fileInfo.Length;
116                 int buffLength = 2048;
117                 byte[] buff = new byte[buffLength];
118                 int contentLen;
119                 using (FileStream fs = fileInfo.OpenRead())
120                 {
121                     using (Stream strm = ftp.GetRequestStream())
122                     {
123                         contentLen = fs.Read(buff, 0, buffLength);
124                         while (contentLen != 0)
125                         {
126                             strm.Write(buff, 0, contentLen);
127                             contentLen = fs.Read(buff, 0, buffLength);
128                         }
129                         strm.Close();
130                     }
131                     fs.Close();
132                 }
133             });
134         }
135 
136         /// <summary>
137         /// 从一个目录将其内容复制到另一目录
138         /// </summary>
139         /// <param name="localDir">源目录</param>
140         /// <param name="DirName">目标目录</param>
141         public void UploadAllFile(string localDir, string DirName = "")
142         {
143             string localDirName = string.Empty;
144             int targIndex = localDir.LastIndexOf("\");
145             if (targIndex > -1 && targIndex != (localDir.IndexOf(":\") + 1))
146                 localDirName = localDir.Substring(0, targIndex);
147             localDirName = localDir.Substring(targIndex + 1);
148             string newDir = Path.Combine(DirName, localDirName);
149             MethodInvoke($@"UploadAllFile({localDir},{DirName})", () =>
150             {
151                 MakeDir(newDir);
152                 DirectoryInfo directoryInfo = new DirectoryInfo(localDir);
153                 FileInfo[] files = directoryInfo.GetFiles();
154                 //复制所有文件  
155                 foreach (FileInfo file in files)
156                 {
157                     UploadFile(file.FullName, newDir);
158                 }
159                 //最后复制目录  
160                 DirectoryInfo[] directoryInfoArray = directoryInfo.GetDirectories();
161                 foreach (DirectoryInfo dir in directoryInfoArray)
162                 {
163                     UploadAllFile(Path.Combine(localDir, dir.Name), newDir);
164                 }
165             });
166         }
167 
168         /// <summary> 
169         /// 删除单个文件
170         /// </summary>
171         /// <param name="filePath"></param>
172         public bool DelFile(string filePath)
173         {
174             string uri = Path.Combine(ftpURI, filePath);
175             return MethodInvoke($@"DelFile({filePath})", () =>
176             {
177                 FtpWebRequest ftp = GetRequest(uri);
178                 ftp.Method = WebRequestMethods.Ftp.DeleteFile;
179                 FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
180                 response.Close();
181             });
182         }
183 
184         /// <summary> 
185         /// 删除最末及空目录
186         /// </summary>
187         /// <param name="dirName"></param>
188         private bool DelDir(string dirName)
189         {
190             string uri = Path.Combine(ftpURI, dirName);
191             return MethodInvoke($@"DelDir({dirName})", () =>
192             {
193                 FtpWebRequest ftp = GetRequest(uri);
194                 ftp.Method = WebRequestMethods.Ftp.RemoveDirectory;
195                 FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
196                 response.Close();
197             });
198         }
199 
200         /// <summary> 删除目录或者其目录下所有的文件 </summary>
201         /// <param name="dirName">目录名称</param>
202         /// <param name="ifDelSub">是否删除目录下所有的文件</param>
203         public bool DelAll(string dirName)
204         {
205             var list = GetAllFtpFile(new List<ActFile>(),dirName);
206             if (list == null)   return  DelDir(dirName);
207             if (list.Count==0)  return  DelDir(dirName);//删除当前目录
208             var newlist = list.OrderByDescending(x => x.level);
209             foreach (var item in newlist)
210             {
211                 FluentConsole.Yellow.Line($@"level:{item.level},isDir:{item.isDir},path:{item.path}");
212             }
213             string uri = Path.Combine(ftpURI, dirName);
214             return MethodInvoke($@"DelAll({dirName})", () =>
215             {
216                 foreach (var item in newlist)
217                 {
218                     if (item.isDir)//判断是目录调用目录的删除方法
219                         DelDir(item.path);
220                     else
221                         DelFile(item.path);
222                 }
223                 DelDir(dirName);//删除当前目录
224                 return true;
225             });
226         }
227 
228         /// <summary>
229         /// 下载单个文件
230         /// </summary>
231         /// <param name="ftpFilePath">从ftp要下载的文件路径</param>
232         /// <param name="localDir">下载至本地路径</param>
233         /// <param name="filename">文件名</param>
234         public bool DownloadFile(string ftpFilePath, string saveDir)
235         {
236             string filename = ftpFilePath.Substring(ftpFilePath.LastIndexOf("\") + 1);
237             string tmpname = Guid.NewGuid().ToString();
238             string uri = Path.Combine(ftpURI, ftpFilePath);
239             return MethodInvoke($@"DownloadFile({ftpFilePath},{saveDir},{filename})", () =>
240             {
241                 if (!Directory.Exists(saveDir)) Directory.CreateDirectory(saveDir);
242                 FtpWebRequest ftp = GetRequest(uri);
243                 ftp.Method = WebRequestMethods.Ftp.DownloadFile;
244                 using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse())
245                 {
246                     using (Stream responseStream = response.GetResponseStream())
247                     {
248                         using (FileStream fs = new FileStream(Path.Combine(saveDir, filename), FileMode.CreateNew))
249                         {
250                             byte[] buffer = new byte[2048];
251                             int read = 0;
252                             do
253                             {
254                                 read = responseStream.Read(buffer, 0, buffer.Length);
255                                 fs.Write(buffer, 0, read);
256                             } while (!(read == 0));
257                             responseStream.Close();
258                             fs.Flush();
259                             fs.Close();
260                         }
261                         responseStream.Close();
262                     }
263                     response.Close();
264                 }
265             });
266         }
267 
268         /// <summary>    
269         /// 从FTP下载整个文件夹    
270         /// </summary>    
271         /// <param name="dirName">FTP文件夹路径</param>    
272         /// <param name="saveDir">保存的本地文件夹路径</param>    
273         public void DownloadAllFile(string dirName, string saveDir)
274         {
275             MethodInvoke($@"DownloadAllFile({dirName},{saveDir})", () =>
276             {
277                 List<ActFile> files = GetFtpFile(dirName);
278                 if (!Directory.Exists(saveDir))
279                 {
280                     Directory.CreateDirectory(saveDir);
281                 }
282                 foreach (var f in files)
283                 {
284                     if (f.isDir) //文件夹,递归查询  
285                     {
286                         DownloadAllFile(Path.Combine(dirName,f.name), Path.Combine(saveDir ,f.name));
287                     }
288                     else //文件,直接下载  
289                     {
290                         DownloadFile(Path.Combine(dirName,f.name), saveDir);
291                     }
292                 }
293             });
294         }
295 
296         /// <summary>
297         /// 获取当前目录下的目录及文件
298         /// </summary>
299         /// param name="ftpfileList"></param>
300         /// <param name="dirName"></param>
301         /// <returns></returns>
302         public List<ActFile> GetFtpFile(string dirName,int ilevel = 0)
303         {
304             var ftpfileList = new List<ActFile>();
305             string uri = Path.Combine(ftpURI, dirName);
306             return MethodInvoke($@"GetFtpFile({dirName})", () =>
307             {
308                 var a = new List<List<string>>();
309                 FtpWebRequest ftp = GetRequest(uri);
310                 ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
311                 Stream stream = ftp.GetResponse().GetResponseStream();
312                 using (StreamReader sr = new StreamReader(stream))
313                 {
314                     string line = sr.ReadLine();
315                     while (!string.IsNullOrEmpty(line))
316                     {
317                         ftpfileList.Add(new ActFile { isDir = line.IndexOf("<DIR>") > -1, name = line.Substring(39).Trim(), path = Path.Combine(dirName, line.Substring(39).Trim()), level= ilevel });
318                         line = sr.ReadLine();
319                     }
320                     sr.Close();
321                 }
322                 return ftpfileList;
323             });
324 
325 
326         }
327 
328         /// <summary>
329         /// 获取FTP目录下的所有目录及文件包括其子目录和子文件
330         /// </summary>
331         /// param name="result"></param>
332         /// <param name="dirName"></param>
333         /// <returns></returns>
334         public List<ActFile> GetAllFtpFile(List<ActFile> result,string dirName, int level = 0)
335         {
336             var ftpfileList = new List<ActFile>();
337             string uri = Path.Combine(ftpURI, dirName);
338             return MethodInvoke($@"GetAllFtpFile({dirName})", () =>
339             {
340                  ftpfileList = GetFtpFile(dirName, level);
341                 result.AddRange(ftpfileList);
342                 var newlist = ftpfileList.Where(x => x.isDir).ToList();
343                 foreach (var item in newlist)
344                 {
345                     GetAllFtpFile(result,item.path, level+1);
346                 }
347                 return result;
348             });
349 
350         }
351 
352         /// <summary>
353         /// 检查目录是否存在
354         /// </summary>
355         /// <param name="dirName"></param>
356         /// <param name="currentDir"></param>
357         /// <returns></returns>
358         public bool CheckDir(string dirName, string currentDir = "")
359         {
360             string uri = Path.Combine(ftpURI, currentDir);
361             return MethodInvoke($@"CheckDir({dirName}{currentDir})", () =>
362             {
363                 FtpWebRequest ftp = GetRequest(uri);
364                 ftp.UseBinary = true;
365                 ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
366                 Stream stream = ftp.GetResponse().GetResponseStream();
367                 using (StreamReader sr = new StreamReader(stream))
368                 {
369                     string line = sr.ReadLine();
370                     while (!string.IsNullOrEmpty(line))
371                     {
372                         if (line.IndexOf("<DIR>") > -1)
373                         {
374                             if (line.Substring(39).Trim() == dirName)
375                                 return true;
376                         }
377                         line = sr.ReadLine();
378                     }
379                     sr.Close();
380                 }
381                 stream.Close();
382                 return false;
383             });
384 
385         }
386 
387         ///  </summary>
388         /// 在ftp服务器上创建指定目录,父目录不存在则创建
389         /// </summary>
390         /// <param name="dirName">创建的目录名称</param>
391         public bool MakeDir(string dirName)
392         {
393             var dirs = dirName.Split('\').ToList();//针对多级目录分割
394             string currentDir = string.Empty;
395             return MethodInvoke($@"MakeDir({dirName})", () =>
396             {
397                 foreach (var dir in dirs)
398                 {
399                     if (!CheckDir(dir, currentDir))//检查目录不存在则创建
400                     {
401                         currentDir = Path.Combine(currentDir, dir);
402                         string uri = Path.Combine(ftpURI, currentDir);
403                         FtpWebRequest ftp = GetRequest(uri);
404                         ftp.Method = WebRequestMethods.Ftp.MakeDirectory;
405                         FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
406                         response.Close();
407                     }
408                     else
409                     {
410                         currentDir = Path.Combine(currentDir, dir);
411                     }
412                 }
413 
414             });
415 
416         }
417 
418         /// <summary>文件重命名 </summary>
419         /// <param name="currentFilename">当前名称</param>
420         /// <param name="newFilename">重命名名称</param>
421         /// <param name="currentFilename">所在的目录</param>
422         public bool Rename(string currentFilename, string newFilename, string dirName = "")
423         {
424             string uri = Path.Combine(ftpURI, dirName, currentFilename);
425             return MethodInvoke($@"Rename({currentFilename},{newFilename},{dirName})", () =>
426             {
427                 FtpWebRequest ftp = GetRequest(uri);
428                 ftp.Method = WebRequestMethods.Ftp.Rename;
429                 ftp.RenameTo = newFilename;
430                 FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
431                 response.Close();
432             });
433         }
434     }
435 
436     public class ActFile
437     {
438         public int level { get; set; } = 0;
439         public bool isDir { get; set; }
440         public string name { get; set; }
441         public string path { get; set; } = "";
442     }
443 }

免责声明:文章转载自《ftp操作方法整理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇oracle 内置函数(一)数值函数php入门常量下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JavaEE-02 JSP数据交互01

学习要点 request对象 response对象 转发与重定向 session对象 include指令 课程回顾 需求描述:编写JSP页面,计算2000—3000年中存在几个闰年。 实现分析:判断闰年的算法写在方法boolean leapYear(int year)中。 提示:闰年——能够被4整除而不能被100整除,或者能够被400整除。 JSP...

MySql与Java的时间类型

MySql与Java的时间类型 MySql的时间类型有Java中与之对应的时间类型datejava.sql.Date Datetimejava.sql.Timestamp Timestampjava.sql.Timestamp Timejava.sql.Time Yearjava.sql.Date 对其进行分析参考MySql 的reference ma...

如何上传网站程序(文件浏览器上传网页、FileZilla上传网站程序)

问题场景: 网页制作完成后,程序需上传至虚拟主机。 注意事项: Windows系统的主机请将全部网页文件直接上传到FTP根目录,即/。 Linux系统的主机请将全部网页文件直接上传到/htdocs目录下。 由于Linux主机的文件名是区别大小写的,文件命名需要注意规范,建议使用小写字母,数字或者带下划线,不要使用汉字 。 如果网页文件较多,上传较慢,强烈建...

linux内核之文件系统

本文主要是基于百度文库的《Linux2.4.30内核文件系统学习(多图).doc》和360doc的《Linux内核虚拟文件系统》修改而来,当然还参考了其他的一些文档,在此就不一一列出了。本来在看到这些文章后,都没有勇气再写点文件系统方面的东西了,这些文章实在太精彩了。最后还是鼓足勇气决定把整理的资料增加了一点自己的理解写下来,主要目的是让各位高手看看我的理...

Socket服务器-Websocket支持多端连入

socket服务端: using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Security.Cryptography;using System.Text;using Sys...

06_zookeeper原生Java API使用

【Zookeeper构造方法概述】 /** * 客户端和zk服务端的连接是一个异步的过程 * 当连接成功后,客户端会收到一个watch通知 * * ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, *...