C#操作FTP, FTPHelper和SFTPHelper

1. FTPHelper

  1 using System;
  2 using System.Collections.Generic;
  3 using System.IO;
  4 using System.Net;
  5 using System.Text;
  6 
  7 public class FTPHelper
  8     {
  9         /// <summary>
 10         /// 上传文件
 11         /// </summary>
 12         /// <param name="fileinfo">需要上传的文件</param>
 13         /// <param name="targetDir">目标路径</param>
 14         /// <param name="hostname">ftp地址</param>
 15         /// <param name="username">ftp用户名</param>
 16         /// <param name="password">ftp密码</param>
 17         public static void UploadFile(FileInfo fileinfo, string targetDir, string hostname, string username, string password)
 18         {
 19             //1. check target
 20             string target;
 21             if (targetDir.Trim() == "")
 22             {
 23                 return;
 24             }
 25             string filename = fileinfo.Name;
 26             if (!string.IsNullOrEmpty(filename))
 27                 target = filename;
 28             else
 29                 target = Guid.NewGuid().ToString();  //使用临时文件名
 30 
 31             string URI = "FTP://" + hostname + "/" + targetDir + "/" + target;
 32             ///WebClient webcl = new WebClient();
 33             System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
 34 
 35             //设置FTP命令 设置所要执行的FTP命令,
 36             //ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails;//假设此处为显示指定路径下的文件列表
 37             ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
 38             //指定文件传输的数据类型
 39             ftp.UseBinary = true;
 40             ftp.UsePassive = true;
 41 
 42             //告诉ftp文件大小
 43             ftp.ContentLength = fileinfo.Length;
 44             //缓冲大小设置为2KB
 45             const int BufferSize = 2048;
 46             byte[] content = new byte[BufferSize - 1 + 1];
 47             int dataRead;
 48 
 49             //打开一个文件流 (System.IO.FileStream) 去读上传的文件
 50             using (FileStream fs = fileinfo.OpenRead())
 51             {
 52                 try
 53                 {
 54                     //把上传的文件写入流
 55                     using (Stream rs = ftp.GetRequestStream())
 56                     {
 57                         do
 58                         {
 59                             //每次读文件流的2KB
 60                             dataRead = fs.Read(content, 0, BufferSize);
 61                             rs.Write(content, 0, dataRead);
 62                         } while (!(dataRead < BufferSize));
 63                         rs.Close();
 64                     }
 65 
 66                 }
 67                 catch (Exception ex) { }
 68                 finally
 69                 {
 70                     fs.Close();
 71                 }
 72 
 73             }
 74 
 75             ftp = null;
 76         }
 77 
 78         /// <summary>
 79         /// 下载文件
 80         /// </summary>
 81         /// <param name="localDir">下载至本地路径</param>
 82         /// <param name="FtpDir">ftp目标文件路径</param>
 83         /// <param name="FtpFile">从ftp要下载的文件名</param>
 84         /// <param name="hostname">ftp地址即IP</param>
 85         /// <param name="username">ftp用户名</param>
 86         /// <param name="password">ftp密码</param>
 87         public static void DownloadFile(string localDir, string FtpDir, string FtpFile, string hostname, string username, string password)
 88         {
 89             string URI = "FTP://" + hostname + "/" + FtpDir + "/" + FtpFile;
 90             string tmpname = Guid.NewGuid().ToString();
 91             string localfile = localDir + @"" + tmpname;
 92 
 93             System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
 94             ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile;
 95             ftp.UseBinary = true;
 96             ftp.UsePassive = false;
 97 
 98             using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse())
 99             {
100                 using (Stream responseStream = response.GetResponseStream())
101                 {
102                     //loop to read & write to file
103                     using (FileStream fs = new FileStream(localfile, FileMode.CreateNew))
104                     {
105                         try
106                         {
107                             byte[] buffer = new byte[2048];
108                             int read = 0;
109                             do
110                             {
111                                 read = responseStream.Read(buffer, 0, buffer.Length);
112                                 fs.Write(buffer, 0, read);
113                             } while (!(read == 0));
114                             responseStream.Close();
115                             fs.Flush();
116                             fs.Close();
117                         }
118                         catch (Exception)
119                         {
120                             //catch error and delete file only partially downloaded
121                             fs.Close();
122                             //delete target file as it's incomplete
123                             File.Delete(localfile);
124                             throw;
125                         }
126                     }
127 
128                     responseStream.Close();
129                 }
130 
131                 response.Close();
132             }
133 
134 
135 
136             try
137             {
138                 File.Delete(localDir + @"" + FtpFile);
139                 File.Move(localfile, localDir + @"" + FtpFile);
140 
141 
142                 ftp = null;
143                 ftp = GetRequest(URI, username, password);
144                 ftp.Method = System.Net.WebRequestMethods.Ftp.DeleteFile;
145                 ftp.GetResponse();
146 
147             }
148             catch (Exception ex)
149             {
150                 File.Delete(localfile);
151                 throw ex;
152             }
153 
154             // 记录日志 "从" + URI.ToString() + "下载到" + localDir + @"" + FtpFile + "成功." );
155             ftp = null;
156         }
157 
158 
159         /// <summary>
160         /// 下载文件
161         /// </summary>
162         /// <param name="localDir">下载至本地路径</param>
163         /// <param name="FtpDir">ftp目标文件路径</param>
164         /// <param name="FtpFile">从ftp要下载的文件名</param>
165         /// <param name="hostname">ftp地址即IP</param>
166         /// <param name="username">ftp用户名</param>
167         /// <param name="password">ftp密码</param>
168         public static byte[] DownloadFileBytes(string localDir, string FtpDir, string FtpFile, string hostname, string username, string password)
169         {
170             byte[] bts;
171             string URI = "FTP://" + hostname + "/" + FtpDir + "/" + FtpFile;
172             string tmpname = Guid.NewGuid().ToString();
173             string localfile = localDir + @"" + tmpname;
174 
175             System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
176             ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile;
177             ftp.UseBinary = true;
178             ftp.UsePassive = true;
179 
180             using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse())
181             {
182                 using (Stream responseStream = response.GetResponseStream())
183                 {
184                     //loop to read & write to file
185                     using (MemoryStream fs = new MemoryStream())
186                     {
187                         try
188                         {
189                             byte[] buffer = new byte[2048];
190                             int read = 0;
191                             do
192                             {
193                                 read = responseStream.Read(buffer, 0, buffer.Length);
194                                 fs.Write(buffer, 0, read);
195                             } while (!(read == 0));
196                             responseStream.Close();
197 
198                             //---
199                             byte[] mbt = new byte[fs.Length];
200                             fs.Read(mbt, 0, mbt.Length);
201 
202                             bts = mbt;
203                             //---
204                             fs.Flush();
205                             fs.Close();
206                         }
207                         catch (Exception)
208                         {
209                             //catch error and delete file only partially downloaded
210                             fs.Close();
211                             //delete target file as it's incomplete
212                             File.Delete(localfile);
213                             throw;
214                         }
215                     }
216 
217                     responseStream.Close();
218                 }
219 
220                 response.Close();
221             }
222 
223             ftp = null;
224             return bts;
225         }
226 
227         /// <summary>
228         /// 搜索远程文件
229         /// </summary>
230         /// <param name="targetDir"></param>
231         /// <param name="hostname"></param>
232         /// <param name="username"></param>
233         /// <param name="password"></param>
234         /// <param name="SearchPattern"></param>
235         /// <returns></returns>
236         public static List<string> ListDirectory(string targetDir, string hostname, string username, string password, string SearchPattern)
237         {
238             List<string> result = new List<string>();
239             try
240             {
241                 string URI = "FTP://" + hostname + "/" + targetDir + "/" + SearchPattern;
242 
243                 System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
244                 ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectory;
245                 ftp.UsePassive = true;
246                 ftp.UseBinary = true;
247 
248 
249                 string str = GetStringResponse(ftp);
250                 str = str.Replace("
", "
").TrimEnd('
');
251                 str = str.Replace("
", "
");
252                 if (str != string.Empty)
253                     result.AddRange(str.Split('
'));
254 
255                 return result;
256             }
257             catch { }
258             return null;
259         }
260 
261         private static string GetStringResponse(FtpWebRequest ftp)
262         {
263             //Get the result, streaming to a string
264             string result = "";
265             using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse())
266             {
267                 long size = response.ContentLength;
268                 using (Stream datastream = response.GetResponseStream())
269                 {
270                     using (StreamReader sr = new StreamReader(datastream, System.Text.Encoding.Default))
271                     {
272                         result = sr.ReadToEnd();
273                         sr.Close();
274                     }
275 
276                     datastream.Close();
277                 }
278 
279                 response.Close();
280             }
281 
282             return result;
283         }
284 
285         /// 在ftp服务器上创建目录
286         /// </summary>
287         /// <param name="dirName">创建的目录名称</param>
288         /// <param name="ftpHostIP">ftp地址</param>
289         /// <param name="username">用户名</param>
290         /// <param name="password">密码</param>
291         public void MakeDir(string dirName, string ftpHostIP, string username, string password)
292         {
293             try
294             {
295                 string uri = "ftp://" + ftpHostIP + "/" + dirName;
296                 System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
297                 ftp.Method = WebRequestMethods.Ftp.MakeDirectory;
298 
299                 FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
300                 response.Close();
301             }
302             catch (Exception ex)
303             {
304                 throw new Exception(ex.Message);
305             }
306         }
307 
308         /// <summary>
309         /// 删除文件
310         /// </summary>
311         /// <param name="dirName">创建的目录名称</param>
312         /// <param name="ftpHostIP">ftp地址</param>
313         /// <param name="username">用户名</param>
314         /// <param name="password">密码</param>
315         public static void delFile(string dirName, string filename, string ftpHostIP, string username, string password)
316         {
317             try
318             {
319                 string uri = "ftp://" + ftpHostIP + "/";
320                 if (!string.IsNullOrEmpty(dirName)) {
321                     uri += dirName + "/";
322                 }
323                 uri += filename;
324                 System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
325                 ftp.Method = WebRequestMethods.Ftp.DeleteFile;
326                 FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
327                 response.Close();
328             }
329             catch (Exception ex)
330             {
331                 throw new Exception(ex.Message);
332             }
333         }
334 
335         /// <summary>
336         /// 删除目录
337         /// </summary>
338         /// <param name="dirName">创建的目录名称</param>
339         /// <param name="ftpHostIP">ftp地址</param>
340         /// <param name="username">用户名</param>
341         /// <param name="password">密码</param>
342         public void delDir(string dirName, string ftpHostIP, string username, string password)
343         {
344             try
345             {
346                 string uri = "ftp://" + ftpHostIP + "/" + dirName;
347                 System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
348                 ftp.Method = WebRequestMethods.Ftp.RemoveDirectory;
349                 FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
350                 response.Close();
351             }
352             catch (Exception ex)
353             {
354                 throw new Exception(ex.Message);
355             }
356         }
357 
358         /// <summary>
359         /// 文件重命名
360         /// </summary>
361         /// <param name="currentFilename">当前目录名称</param>
362         /// <param name="newFilename">重命名目录名称</param>
363         /// <param name="ftpServerIP">ftp地址</param>
364         /// <param name="username">用户名</param>
365         /// <param name="password">密码</param>
366         public void Rename(string currentFilename, string newFilename, string ftpServerIP, string username, string password)
367         {
368             try
369             {
370 
371                 FileInfo fileInf = new FileInfo(currentFilename);
372                 string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
373                 System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
374                 ftp.Method = WebRequestMethods.Ftp.Rename;
375 
376                 ftp.RenameTo = newFilename;
377                 FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
378 
379                 response.Close();
380             }
381             catch (Exception ex)
382             {
383                 throw new Exception(ex.Message);
384             }
385         }
386 
387         private static FtpWebRequest GetRequest(string URI, string username, string password)
388         {
389             //根据服务器信息FtpWebRequest创建类的对象
390             FtpWebRequest result = (FtpWebRequest)FtpWebRequest.Create(URI);
391             //提供身份验证信息
392             result.Credentials = new System.Net.NetworkCredential(username, password);
393             //设置请求完成之后是否保持到FTP服务器的控制连接,默认值为true
394             result.KeepAlive = false;
395             return result;
396         }
397 
398         /*
399         /// <summary>
400         /// 向Ftp服务器上传文件并创建和本地相同的目录结构
401         /// 遍历目录和子目录的文件
402         /// </summary>
403         /// <param name="file"></param>
404         private void GetFileSystemInfos(FileSystemInfo file)
405         {
406             string getDirecName = file.Name;
407             if (!ftpIsExistsFile(getDirecName, "192.168.0.172", "Anonymous", "") && file.Name.Equals(FileName))
408             {
409                 MakeDir(getDirecName, "192.168.0.172", "Anonymous", "");
410             }
411             if (!file.Exists) return;
412             DirectoryInfo dire = file as DirectoryInfo;
413             if (dire == null) return;
414             FileSystemInfo[] files = dire.GetFileSystemInfos();
415 
416             for (int i = 0; i < files.Length; i++)
417             {
418                 FileInfo fi = files[i] as FileInfo;
419                 if (fi != null)
420                 {
421                     DirectoryInfo DirecObj = fi.Directory;
422                     string DireObjName = DirecObj.Name;
423                     if (FileName.Equals(DireObjName))
424                     {
425                         UploadFile(fi, DireObjName, "192.168.0.172", "Anonymous", "");
426                     }
427                     else
428                     {
429                         Match m = Regex.Match(files[i].FullName, FileName + "+.*" + DireObjName);
430                         //UploadFile(fi, FileName+"/"+DireObjName, "192.168.0.172", "Anonymous", "");
431                         UploadFile(fi, m.ToString(), "192.168.0.172", "Anonymous", "");
432                     }
433                 }
434                 else
435                 {
436                     string[] ArrayStr = files[i].FullName.Split('\');
437                     string finame = files[i].Name;
438                     Match m = Regex.Match(files[i].FullName, FileName + "+.*" + finame);
439                     //MakeDir(ArrayStr[ArrayStr.Length - 2].ToString() + "/" + finame, "192.168.0.172", "Anonymous", "");
440                     MakeDir(m.ToString(), "192.168.0.172", "Anonymous", "");
441                     GetFileSystemInfos(files[i]);
442                 }
443             }
444         }
445          * */
446 
447         /// <summary>
448         /// 判断ftp服务器上该目录是否存在
449         /// </summary>
450         /// <param name="dirName"></param>
451         /// <param name="ftpHostIP"></param>
452         /// <param name="username"></param>
453         /// <param name="password"></param>
454         /// <returns></returns>
455         private bool ftpIsExistsFile(string dirName, string ftpHostIP, string username, string password)
456         {
457             bool flag = true;
458             try
459             {
460                 string uri = "ftp://" + ftpHostIP + "/" + dirName;
461                 System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
462                 ftp.Method = WebRequestMethods.Ftp.ListDirectory;
463 
464                 FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
465                 response.Close();
466             }
467             catch (Exception)
468             {
469                 flag = false;
470             }
471             return flag;
472         }
473     }
View Code


2. SFTPHelper

SFTPHelper采用第三方的Tamir.SharpSSH.dll

下载地址: http://www.tamirgal.com/blog/page/SharpSSH.aspx

  1 using System;
  2 using Tamir.SharpSsh.jsch;
  3 using System.Collections;
  4 
  5 
  6 public class SFTPHelper
  7 {
  8     private Session m_session;
  9     private Channel m_channel;
 10     private ChannelSftp m_sftp;
 11 
 12     //host:sftp地址   user:用户名   pwd:密码        
 13     public SFTPHelper(string host, string user, string pwd)
 14     {
 15         string[] arr = host.Split(':');
 16         string ip = arr[0];
 17         int port = 22;
 18         if (arr.Length > 1) port = Int32.Parse(arr[1]);
 19 
 20         JSch jsch = new JSch();
 21         m_session = jsch.getSession(user, ip, port);
 22         MyUserInfo ui = new MyUserInfo();
 23         ui.setPassword(pwd);
 24         m_session.setUserInfo(ui);
 25 
 26     }
 27 
 28     //SFTP连接状态        
 29     public bool Connected { get { return m_session.isConnected(); } }
 30 
 31     //连接SFTP        
 32     public bool Connect()
 33     {
 34         try
 35         {
 36             if (!Connected)
 37             {
 38                 m_session.connect();
 39                 m_channel = m_session.openChannel("sftp");
 40                 m_channel.connect();
 41                 m_sftp = (ChannelSftp)m_channel;
 42             }
 43             return true;
 44         }
 45         catch
 46         {
 47             return false;
 48         }
 49     }
 50 
 51     //断开SFTP        
 52     public void Disconnect()
 53     {
 54         if (Connected)
 55         {
 56             m_channel.disconnect();
 57             m_session.disconnect();
 58         }
 59     }
 60 
 61     //SFTP存放文件        
 62     public bool Put(string localPath, string remotePath)
 63     {
 64         try
 65         {
 66             Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(localPath);
 67             Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(remotePath);
 68             m_sftp.put(src, dst);
 69             return true;
 70         }
 71         catch
 72         {
 73             return false;
 74         }
 75     }
 76 
 77     //SFTP获取文件        
 78     public bool Get(string remotePath, string localPath)
 79     {
 80         try
 81         {
 82             Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(remotePath);
 83             Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(localPath);
 84             m_sftp.get(src, dst);
 85             return true;
 86         }
 87         catch
 88         {
 89             return false;
 90         }
 91     }
 92     //删除SFTP文件
 93     public bool Delete(string remoteFile)
 94     {
 95         try
 96         {
 97             m_sftp.rm(remoteFile);
 98             return true;
 99         }
100         catch
101         {
102             return false;
103         }
104     }
105 
106     //获取SFTP文件列表        
107     public ArrayList GetFileList(string remotePath, string fileType)
108     {
109         try
110         {
111             Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(remotePath);
112             ArrayList objList = new ArrayList();
113             foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry qqq in vvv)
114             {
115                 string sss = qqq.getFilename();
116                 if (sss.Length > (fileType.Length + 1) && fileType == sss.Substring(sss.Length - fileType.Length))
117                 { objList.Add(sss); }
118                 else { continue; }
119             }
120 
121             return objList;
122         }
123         catch
124         {
125             return null;
126         }
127     }
128 
129 
130     //登录验证信息        
131     public class MyUserInfo : UserInfo
132     {
133         String passwd;
134         public String getPassword() { return passwd; }
135         public void setPassword(String passwd) { this.passwd = passwd; }
136 
137         public String getPassphrase() { return null; }
138         public bool promptPassphrase(String message) { return true; }
139 
140         public bool promptPassword(String message) { return true; }
141         public bool promptYesNo(String message) { return true; }
142         public void showMessage(String message) { }
143     }
144 
145 
146 }
View Code
原文地址:https://www.cnblogs.com/kkwoo/p/3488642.html