最近项目中需要用到SFTP来上传,下载文件,经过查资料,POC终于修成正果,先将具体的实现过程写下,方便同样需求的兄弟,姐妹参考。
名字解释
SFTP:SecureFileTransferProtocol的缩写,安全文件传送协议.相对于FTP多了一个加密的过程。
个人总结了一下要实现C#对SFTP的操作(上传,下载,删除,遍历等等)有2种较快的途径
1.购买第三方的类库
2.使用开源的类库(比较流行的:SharpSSH,SshNet)
这里用的是SharpSSH.以下的内容基于SharpSSH。
具体步骤
1.从网站下载SharpSSH的源码(http://www.tamirgal.com/blog/page/SharpSSH.aspx)
这里可以下载源码+Bin文件,注:如果只下载Bin文件,里面的类库是不包含Delete file操作的。
因为项目需求,我们需要对远程文件进行删除,所以下载源码,加入Delete Function,然后重新编译
SharpSSH源码结构
我们需要在Sftp.cs 文件中加入Delete function,如下图所示。
重新编译,然后将生成的3个dll引用到项目中
2.基于SharpSSH,实现SFTP的常用操作
新建一个SFTPHelper.cs
public class SFTPHelper
{
private SshTransferProtocolBase m_sshCp;
private SFTPHelper()
{
}
public SFTPHelper(SshConnectionInfo connectionInfo)
{
m_sshCp = new Sftp(connectionInfo.Host, connectionInfo.User);
if (connectionInfo.Pass != null)
{
m_sshCp.Password = connectionInfo.Pass;
}
if (connectionInfo.IdentityFile != null)
{
m_sshCp.AddIdentityFile(connectionInfo.IdentityFile);
}
}
public bool Connected
{
get
{
return m_sshCp.Connected;
}
}
public void Connect()
{
if (!m_sshCp.Connected)
{
m_sshCp.Connect();
}
}
public void Close()
{
if (m_sshCp.Connected)
{
m_sshCp.Close();
}
}
public bool Upload(string localPath, string remotePath)
{
try
{
if (!m_sshCp.Connected)
{
m_sshCp.Connect();
}
m_sshCp.Put(localPath, remotePath);
return true;
}
catch
{
return false;
}
}
public bool Download(string remotePath, string localPath)
{
try
{
if (!m_sshCp.Connected)
{
m_sshCp.Connect();
}
m_sshCp.Get(remotePath, localPath);
return true;
}
catch
{
return false;
}
}
public bool Delete(string remotePath)
{
try
{
if (!m_sshCp.Connected)
{
m_sshCp.Connect();
}
((Sftp)m_sshCp).Delete(remotePath);//刚刚新增的Delete方法
return true;
}
catch
{
return false;
}
}
public ArrayList GetFileList(string path)
{
try
{
if (!m_sshCp.Connected)
{
m_sshCp.Connect();
}
return ((Sftp)m_sshCp).GetFileList(path);
}
catch
{
return null;
}
}
}
创建一个辅助类
public class SshConnectionInfo
{
public string IdentityFile { get; set; }
public string Pass { get; set; }
public string Host { get; set; }
public string User { get; set; }
}
上传文件
SshConnectionInfo objInfo = new SshConnectionInfo();
objInfo.User = "username";
objInfo.Host = "host";
objInfo.IdentityFile = "key"; //有2中认证,一种基于PrivateKey,一种基于password
//objInfo.Pass = "password"; 基于密码
SFTPHelper objSFTPHelper = new SFTPHelper(objInfo);
objSFTPHelper.Upload("localFile", "remoteFile");
objSFTPHelper.Download("remoteFile", "localFile");
删除文件
objSFTPHelper.Delete("remoteFile");
遍历远程文件夹
ArrayList fileList = objSFTPHelper.GetFileList("remotePath");