因为项目的需要,整理了一段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: string fullRemotePath = defRemotePath + remotePath.TrimStart(‘/‘);
117: Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(fullRemotePath);
118: List<string> objList = new List<string>();
119: foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry qqq in vvv)
120: {
121: string sss = qqq.getFilename();
122: if (sss.Length > (fileType.Length + 1) && fileType == sss.Substring(sss.Length - fileType.Length))
123: { objList.Add(sss); }
124: else { continue; }
125: }
126: return objList;
127: }
128:
129: /// <summary>
130: /// 目录是否存在
131: /// </summary>
132: /// <param name="dirName">目录名称必须从根开始</param>
133: /// <returns></returns>
134: public bool DirExist(string dirName)
135: {
136: try
137: {
138: m_sftp.ls(defRemotePath + dirName.TrimStart(‘/‘));
139: return true;
140: }
141: catch (Tamir.SharpSsh.jsch.SftpException)
142: {
143: return false;//执行ls命令时出错,则目录不存在。
144: }
145: }
146:
147: /// <summary>
148: /// 创建目录
149: /// </summary>
150: /// <param name="dirName">目录名称必须从根开始</param>
151: /// <returns></returns>
152: public void Mkdir(string dirName)
153: {
154: Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(defRemotePath);
155: foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry fileName in vvv)
156: {
157: string name = fileName.getFilename();
158: if (name == dirName)
159: {
160: throw new Exception("dir is exist");
161: }
162: }
163: m_sftp.mkdir(defRemotePath + dirName.TrimStart(‘/‘));
164: }
165:
166: /// <summary>
167: /// 连接SFTP
168: /// </summary>
169: public void ConnectSftp()
170: {
171: JSch jsch = new JSch(); //利用java实现的通讯包
172: m_session = jsch.getSession(this.UserName, this.HostName, this.Port);
173: m_session.setHost(this.HostName);
174: MyUserInfo ui = new MyUserInfo();
175: ui.setPassword(this.Password);
176: m_session.setUserInfo(ui);
177:
178: if (!m_session.isConnected())
179: {
180: m_session.connect();
181: m_channel = m_session.openChannel("sftp");
182: m_channel.connect();
183: m_sftp = (ChannelSftp)m_channel;
184: }
185: }
186:
187: /// <summary>
188: /// 断开SFTP
189: /// </summary>
190: public void DisconnectSftp()
191: {
192: if (m_session.isConnected())
193: {
194: m_channel.disconnect();
195: m_session.disconnect();
196: }
197: }
198:
199:
200:
201: #endregion
202:
203: //登录验证信息
204: private class MyUserInfo : UserInfo
205: {
206: String passwd;
207: public String getPassword() { return passwd; }
208: public void setPassword(String passwd) { this.passwd = passwd; }
209:
210: public String getPassphrase() { return null; }
211: public bool promptPassphrase(String message) { return true; }
212:
213: public bool promptPassword(String message) { return true; }
214: public bool promptYesNo(String message) { return true; }
215: public void showMessage(String message) { }
216: }
217:
218: public void Dispose()
219: {
220: this.DisconnectSftp();
221: }
222: }
223:
224:
225: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
配置文件内容:
<?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>
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }