.net操作sftp服务器

Petunia ·
更新时间:2024-11-13
· 927 次阅读

  因为项目的需要,整理了一段C#操作sftp的方法。   依赖的第三方类库名称为:SharpSSH 1.1.1.13.   代码如下: 1:  using System; 2:  using System.Collections.Generic; 3:  using System.Linq; 4:  using System.Text; 5:  using System.Collections.Specialized; 6:  using System.Configuration; 7:  using Tamir.SharpSsh; 8:  using System.IO; 9:  using Tamir.SharpSsh.jsch; 10: 11:  namespace TestSftp 12:  { 13:      /// <summary> 14:      /// 访问Sftp服务器方法(凭证请在config文件中配置) 15:      /// </summary> 16:      public class SftpClient : IDisposable 17:      { 18:          #region Properties 19: 20:          /// <summary> 21:          /// 主机名或IP 22:          /// </summary> 23:          public string HostName { get; private set; } 24:          /// <summary> 25:          /// 用户名 26:          /// </summary> 27:          public string UserName { get; private set; } 28:          /// <summary> 29:          /// 密码 30:          /// </summary> 31:          public string Password { get; private set; } 32: 33:          /// <summary> 34:          /// 端口号(默认端口为22) 35:          /// </summary> 36:          public int Port { get; private set; } 37: 38:          #endregion 39: 40:          private static readonly string defRemotePath = "/";//默认操作是都是从根目录开始。 41:          private ChannelSftp m_sftp; 42:          private Session m_session; 43:          Channel m_channel; 44: 45:          /// <summary> 46:          /// 从配置文件中加载凭证信息 47:          /// </summary> 48:          public SftpClient() 49:          { 50:              var config = ConfigurationManager.GetSection("SftpServer") as NameValueCollection; 51:              this.HostName = config["host_name"]; 52:              this.UserName = config["user_name"]; 53:              this.Password = config["password"]; 54:              this.Port = Convert.ToInt32(config["port"] ?? "22");//默认端口为22 55:          } 56: 57:          #region Events 58: 59:          /// <summary> 60:          /// SFTP获取文件 61:          /// </summary> 62:          /// <param name="remotePath"></param> 63:          /// <param name="localPath"></param> 64:          /// <returns></returns> 65: 66:          public bool Get(string remotePath, string localPath) 67:          { 68:              try 69:              { 70:                  string fullRemotePath = defRemotePath + remotePath.TrimStart('/'); 71:                  Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(fullRemotePath); 72:                  Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(localPath); 73:                  m_sftp.get(src, dst); 74:                  return true; 75:              } 76:              catch 77:              { 78:                  return false; 79:              } 80:          } 81: 82:          /// <summary> 83:          ///SFTP存放文件 84:          /// </summary> 85:          /// <param name="localPath"></param> 86:          /// <param name="remotePath"></param> 87:          /// <returns></returns> 88:          public void Put(string localPath, string remotePath) 89:          { 90:              Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(localPath); 91:              string fullRemotePath = defRemotePath + remotePath.TrimStart('/'); 92:              Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(fullRemotePath); 93:              m_sftp.put(src, dst); 94:          } 95: 96:97:          /// <summary> 98:          /// 删除SFTP文件 99:          /// </summary> 100:          /// <param name="remoteFile"></param> 101:          /// <returns></returns> 102: 103:          public void Delete(string remoteFile) 104:          { 105:              string fullRemotePath = defRemotePath + remoteFile.TrimStart('/'); 106:              m_sftp.rm(fullRemotePath); 107:          } 108:          /// <summary> 109:          /// 获取SFTP文件列表 110:          /// </summary> 111:          /// <param name="remotePath"></param> 112:          /// <param name="fileType">文件后缀名称(.txt)</param> 113:          /// <returns></returns> 114:          public List<string> GetFileList(string remotePath, string fileType) 115:          { 116:              List<string> objList = new List<string>(); 117:              string fullRemotePath = defRemotePath + remotePath.TrimStart('/'); 118:              if (DirExist(fullRemotePath)) 119:              { 120:                  Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(fullRemotePath); 121:                  foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry qqq in vvv) 122:                  { 123:                      string sss = qqq.getFilename(); 124:                      if (sss.Length > (fileType.Length + 1) && fileType == sss.Substring(sss.Length - fileType.Length)) 125:                      { objList.Add(sss); } 126:                      else { continue; } 127:                  } 128:              } 129:              return objList; 130:          } 131: 132:          /// <summary> 133:          /// 目录是否存在 134:          /// </summary> 135:          /// <param name="dirName">目录名称必须从根开始</param> 136:          /// <returns></returns> 137:          public bool DirExist(string dirName) 138:          { 139:              try 140:              { 141:                  m_sftp.ls(defRemotePath + dirName.TrimStart('/')); 142:                  return true; 143:              } 144:              catch (Tamir.SharpSsh.jsch.SftpException) 145:              { 146:                  return false;//执行ls命令时出错,则目录不存在。 147:              } 148:          } 149: 150:          /// <summary> 151:          /// 创建目录 152:          /// </summary> 153:          /// <param name="dirName">目录名称必须从根开始</param> 154:          /// <returns></returns> 155:          public void Mkdir(string dirName) 156:          { 157:              Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(defRemotePath); 158:              foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry fileName in vvv) 159:              { 160:                  string name = fileName.getFilename(); 161:                  if (name == dirName) 162:                  { 163:                      throw new Exception("dir is exist"); 164:                  } 165:              } 166:              m_sftp.mkdir(defRemotePath + dirName.TrimStart('/')); 167:          } 168: 169:          /// <summary> 170:          /// 连接SFTP 171:          /// </summary> 172:          public void ConnectSftp() 173:          { 174:              JSch jsch = new JSch();   //利用java实现的通讯包 175:              m_session = jsch.getSession(this.UserName, this.HostName, this.Port); 176:              m_session.setHost(this.HostName); 177:              MyUserInfo ui = new MyUserInfo(); 178:              ui.setPassword(this.Password); 179:              m_session.setUserInfo(ui); 180: 181:              if (!m_session.isConnected()) 182:              { 183:                  m_session.connect(); 184:                  m_channel = m_session.openChannel("sftp"); 185:                  m_channel.connect(); 186:                  m_sftp = (ChannelSftp)m_channel; 187:              } 188:          } 189: 190:          /// <summary> 191:          /// 断开SFTP 192:          /// </summary> 193:          public void DisconnectSftp() 194:          { 195:              if (m_session.isConnected()) 196:              { 197:                  m_channel.disconnect(); 198:                  m_session.disconnect(); 199:              } 200:          } 201: 202:          #endregion 203: 204:          //登录验证信息 205:          private class MyUserInfo : UserInfo 206:          { 207:              String passwd; 208:              public String getPassword() { return passwd; } 209:              public void setPassword(String passwd) { this.passwd = passwd; } 210: 211:              public String getPassphrase() { return null; } 212:              public bool promptPassphrase(String message) { return true; } 213: 214:              public bool promptPassword(String message) { return true; } 215:              public bool promptYesNo(String message) { return true; } 216:              public void showMessage(String message) { } 217:          } 218: 219:          public void Dispose() 220:          { 221:              this.DisconnectSftp(); 222:              this.m_channel = null; 223:              this.m_session = null; 224:              this.m_sftp = null; 225:          } 226:      } 227: 228:  }   配置文件内容: <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="SftpServer" type="System.Configuration.NameValueSectionHandler"/> </configSections> <SftpServer> <add key="host_name" value="127.0.0.1"/> <add key="user_name" value="test"/> <add key="password" value="123"/> </SftpServer> </configuration>



net .NET sftp

需要 登录 后方可回复, 如果你还没有账号请 注册新账号