最近项目中需要用到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");


Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐