加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#通过SFTP操作类 连接sftp

发布时间:2020-12-15 19:52:15 所属栏目:百科 来源:网络整理
导读:先上传[SFTP操作类] 1 public class SFTPHelper 2 { 3 private Tamir.SharpSsh.jsch.Session m_session; 4 private Channel m_channel; 5 private ChannelSftp m_sftp; 6 #region 字段或属性 7 #endregion 8 9 // host:sftp地址 user:用户名 pwd:密码 10 p

先上传[SFTP操作类]

  1 public class SFTPHelper
  2 {
  3     private Tamir.SharpSsh.jsch.Session m_session;
  4     private Channel m_channel;
  5     private ChannelSftp m_sftp;
  6     #region 字段或属性 
  7     #endregion
  8 
  9     //host:sftp地址   user:用户名   pwd:密码        
 10     public SFTPHelper(string host,string user,string pwd)
 11     {
 12         string[] arr = host.Split(:);
 13         string ip = arr[0];
 14         int port = 22;
 15         if (arr.Length > 1) port = Int32.Parse(arr[1]);
 16 
 17         JSch jsch = new JSch();
 18         m_session = jsch.getSession(user,ip,port);
 19      
 20         MyUserInfo ui = new MyUserInfo();
 21         ui.setPassword(pwd);
 22         m_session.setUserInfo(ui);
 23 
 24     }
 25  
 26     //SFTP连接状态        
 27     public bool Connected { get { return m_session.isConnected(); } }
 28 
 29     //连接SFTP        
 30     public bool Connect()
 31     {
 32         try
 33         {
 34             if (!Connected)
 35             {
 36                 m_session.connect();
 37                 m_channel = m_session.openChannel("sftp");
 38                 m_channel.connect();
 39                 m_sftp = (ChannelSftp)m_channel;
 40             }
 41             return true;
 42         }
 43         catch
 44         {
 45             return false;
 46         }
 47     }
 48 
 49     //断开SFTP        
 50     public void Disconnect()
 51     {
 52         if (Connected)
 53         {
 54             m_channel.disconnect();
 55             m_session.disconnect();
 56         }
 57     }
 58 
 59     //SFTP存放文件        
 60     public bool Put(string localPath,string remotePath)
 61     {
 62         try
 63         {
 64             Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(localPath);
 65             Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(remotePath);
 66             m_sftp.put(src,dst);
 67             return true;
 68         }
 69         catch (Exception ex)
 70         {
 71 
 72 
 73             return false;
 74         }
 75 
 76 
 77     }
 78 
 79 
 80     /// <summary>
 81     ///    //SFTP获取文件  
 82     /// </summary>
 83     /// <param name="remotePath">服务器路径 </param>
 84     /// <param name="localPath">下载到本机的地址</param>
 85     /// <returns></returns>
 86     public bool Get(string remotePath,string localPath)
 87     {
 88         try
 89         {
 90             string fullRemotePath = "/" + remotePath.TrimStart(/);
 91             Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(fullRemotePath);
 92             Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(localPath);
 93 
 94             m_sftp.get(src,dst);
 95 
 96             //Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(remotePath);
 97             //Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(localPath);
 98 
 99             //m_sftp.get(src,dst);
100 
101 
102             return true;
103         }
104         catch (Exception ex)
105         {
106             return false;
107         }
108     }
109     //删除SFTP文件
110     public bool Delete(string remoteFile)
111     {
112         try
113         {
114             m_sftp.rm(remoteFile);
115             return true;
116         }
117         catch
118         {
119             return false;
120         }
121     }
122 
123     /// <summary>
124     /// 修改文件名称
125     /// </summary>
126     /// <param name="remotrPath"></param>
127     /// <param name="newPath"></param>
128     /// <returns></returns>
129     public bool ReName(string remotrPath,string newPath)
130     {
131         try
132         {
133             m_sftp.rename(remotrPath,newPath);
134             return true;
135         }
136         catch (Exception)
137         {
138 
139             throw;
140         }
141 
142     }
143 
144     /// <summary>
145     /// 创建文件夹
146     /// </summary>
147     /// <param name="remotrPath"></param>
148     /// <returns></returns>
149     public bool Mkdir(string remotrPath)
150     {
151         try
152         {
153             m_sftp.mkdir(remotrPath);
154             return true;
155         }
156         catch (Exception)
157         {
158 
159             return false;
160         }
161     }
162 
163  
164 
165 
166     /// <summary>
167     /// 判断文件sftp 是否存在
168     /// </summary>
169     /// <param name="path">文件目录</param>    
170     /// <returns></returns>
171     public bool isExistDir(string path)
172     {
173         bool isDirExistFlag = false;
174         try
175         {
176             SftpATTRS sftpATTRS = m_sftp.lstat(path);  //lstat()检索文件或目录的文件属性
177             isDirExistFlag = true;
178 
179             return sftpATTRS.isDir();  //isDir()检查此文件是否为目录
180         }
181         catch (Exception e)
182         {
183             if (e.Message.ToLower().Equals("no such file"))
184             {
185                 isDirExistFlag = false;
186             }
187         }
188         return isDirExistFlag;
189 
190     }
191 
192     public string createDir(string createpath)
193     {
194         string mes = "";
195         try
196         {
197             if (isExistDir(createpath))
198             {
199 
200             }
201             else
202             {
203                 string[] pathArry = createpath.Split(/);
204                 foreach (var path in pathArry)
205                 {
206 
207 
208                     {
209                         if (path.Equals(""))
210                         {
211                             continue;
212                         }
213 
214                         if (isExistDir(path))
215                         {
216                             m_sftp.cd(path);
217                             if (isExistDir(createpath))
218                             {
219 
220                             }
221                         }
222                         else
223                         {
224                             // 建立目录
225                             m_sftp.mkdir(path);
226                             // 进入并设置为当前目录
227                             m_sftp.cd(path);
228                         }
229                     }
230                 }
231             }
232         }
233         catch (SftpException e)
234         {
235             mes = ("创建路径错误:" + createpath);
236         }
237         return mes;
238     }
239 
240 
241 
242 
243 
244 
245     //获取SFTP文件列表        
246     public ArrayList GetFileList(string remotePath,string fileType)
247     {
248         try
249         {
250             Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(remotePath);
251             ArrayList objList = new ArrayList();
252             foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry qqq in vvv)
253             {
254                 string sss = qqq.getFilename();
255                 string sq = sss.Substring(sss.Length - fileType.Length);
256                 if (sss.Length > (fileType.Length + 1) && fileType == sss.Substring(sss.Length - fileType.Length))
257                 {
258                     objList.Add(sss);
259                 }
260                 else
261                 {
262                     continue;
263                 }
264             }
265             return objList;
266         }
267         catch
268         {
269             return null;
270         }
271     }
272 
273     //获取SFTP文件列表        
274     public ArrayList GetFileList(string remotePath)
275     {
276         string keyword;
277         try
278         {
279             //Tamir.SharpSsh.java.util.Vector vvv =  sftp.ListDirectory(remotePath);
280             Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(remotePath);
281 
282 
283             ArrayList objList = new ArrayList();
284             foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry qqq in vvv)
285             {
286                 string sss = qqq.getFilename().ToString();
287 
288 
289                 byte[] buffer = Encoding.GetEncoding("GB2312").GetBytes(sss);
290                 keyword = Encoding.UTF8.GetString(buffer);
291 
292                 byte[] buffer1 = Encoding.UTF8.GetBytes(sss);
293               string  keyword1 = Encoding.GetEncoding("GB2312").GetString(buffer);
294 
295 
296                 Encoding d = Encoding.GetEncoding("GBK");
297 
298 
299 
300                 Encoding.UTF8.GetString(d.GetBytes(sss));
301 
302 
303                 ////声明字符集   
304                 //System.Text.Encoding utf8,gb2312;
305                 ////gb2312   
306                 //gb2312 = System.Text.Encoding.GetEncoding("gb2312");
307                 ////utf8   
308                 //utf8 = System.Text.Encoding.GetEncoding("utf-8");
309                 //byte[] gb;
310                 //gb = gb2312.GetBytes(sss);
311                 //gb = System.Text.Encoding.Convert(gb2312,utf8,gb);
312 
313 
314 
315 
316                 //得到4种编码的string  
317                 if (sss.IndexOf(.) != -1)
318                 {
319                     objList.Add(keyword);
320                 }
321                 else
322                 {
323                     continue;
324                 }
325             }
326             return objList;
327         }
328         catch (Exception ex)
329         {
330             return null;
331         }
332     }
333 
334 
335     //登录验证信息        
336     public class MyUserInfo : UserInfo
337     {
338         String passwd;
339         public String getPassword() { return passwd; }
340         public void setPassword(String passwd) { this.passwd = passwd; }
341 
342         public String getPassphrase() { return null; }
343         public bool promptPassphrase(String message) { return true; }
344 
345         public bool promptPassword(String message) { return true; }
346         public bool promptYesNo(String message) { return true; }
347         public void showMessage(String message) { }
348     }
349 
350 
351 }
SFTPHelper操作类

这个类有坑,这几个坑我都修复了,除了文件上传这里还有点bug? 基本好像都没问题

第一个坑? ?获取文件列表,只能获取某种文件后缀的文件,不能获取一个文件夹下面的所有文件

第二个坑 ,没有写创建文件夹这个方法

第三个坑, 下载文件中文名都乱码!!!(这tm是最坑的,目前还没有彻底解决这个问题)

比如说这个文件:

单1 乱码? 单_1 没问题, 现在确定的一个乱码错误就是 中文后面立刻马上来个数字就乱码!!

?

调用很简单:

1  SFTPHelper Ftp = new SFTPHelper(ftpHost,user,pwd);
2                         bool b = Ftp.Connect();
3                         if (b)
4                         {
5                             ArrayList fileList = Ftp.GetFileList(folderName,fsinfo.Name.Split(.)[1]);//主要是检测服务器是否上传这个文件 
6                             RegisterLog("目前上传的文件是:" + fsinfo.FullName);
7                             Ftp.Put(fsinfo.FullName,"" + folderName + "");
8                         }
9                         Ftp.Disconnect();

?

下载:?

 0   SFTPHelper Ftp = new SFTPHelper(ftpHost,pwd);
1
bool b = Ftp.Connect(); 2 if (b) 3 { 4 5 //获取SFTP文件列表 6 // ArrayList fileList = Ftp.GetFileList(folderName,".*"); 7 ArrayList array = Ftp.GetFileList(folderName); 8 if (array.Count > 0) 9 { 10 RegisterLog("正在创建本次需要转移文件夹名称:Dealed" + DateTime.Now.ToString("yyyy-MM-dd") + ""); 11 bool mk= Ftp.Mkdir("DealedDealed" + DateTime.Now.ToString("yyyy-MM-dd"));//创建文件夹 12 if (mk!=true) 13 { 14 RegisterLog("FTP已存在此文件夹!创建失败,正在把文件移动到:Dealed" + DateTime.Now.ToString("yyyy-MM-dd") + ""); 15 } 16 for (int i = 0; i < array.Count; i++) 17 { 18 // RegisterLog("目前下载的文件是:" + array[i].ToString()); 19 bool gftp= Ftp.Get(folderName + "//"+array[i].ToString(),localDir); 20 if (gftp!=true) 21 { 22 23 //RegisterLog("下载成功,正在转移FTP文件到Dealed:" + array[i].ToString()); 24 RegisterLog("此文件命名不合法,出现乱码,建议您修改此文件名称,或者手动下载!"+ array[i].ToString()); //出现乱码文件, 不能下载,这是由于获取文件的时候乱码了,如何根据这个乱码文件找不到服务器上的文件,所以会下载失败 25 26 } 27 else 28 { 29 RegisterLog("文件:" + array[i].ToString()+"下载成功!"); 30 // ftps.Connect(); 31 32 // ftps.Disconnect(); 33 // RegisterLog("正在转移FTP文件到Dealed:" + array[i].ToString()); 34 35 } 36 37 } 38 39 40 } 41 else 42 { 43 RegisterLog("FTP改文件夹内无移动文件,请尝试输入下一级目录:"); 44 45 } 46 47 } 48 Ftp.Disconnect();

?

这里百度到一个SFTP操作类

?

知道这个类了,就比较简单了,主要最麻烦的就是? 下载的时候中文乱码,不知道怎么解决,有大佬会的,麻烦留言一下!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读