因为项目的需要,整理了一段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>