使用 Tamir.SharpSSH 类库实现 SFTP 文件操作

前言

在改一个 VB.NET 的项目,因需要将本机档案上传到云端,所以找到了 Tamir.SharpSSH 这个类库,但很多资料都是介绍如何用 C# 来实现。想把范例改成 VB.NET,但碰到无法继承的问题,或许是对 VB.NET 不熟,无法排解问题,索性把范例纳入 VB.NET 的解决方案中,让 VB.NET 透过 C# 的范例实现 SFTP 文件操作的功能。

作法:

  1. 在原 VB.NET 解决方案中添加一个 C# 项目,设定项目名称为 JasperSFTP。
    在这里插入图片描述
    在这里插入图片描述
  2. 在 JasperSFTP 项目中添加引用三个 DLL:DiffieHellman, Org.Mentalis.Security 及 Tamir.SharpSSH。
    在这里插入图片描述
  3. 在 JasperSFTP 项目中添加一个SFTPHelper 类,完整代码如下:
using System;
using System.Collections;
using Tamir.SharpSsh;
using Tamir.SharpSsh.jsch;
using Org.Mentalis.Security;

namespace JasperSFTP
{
    public class SFTPHelper
    {
        private Session m_session;
        private Channel m_channel;
        private ChannelSftp m_sftp;

        public SFTPHelper(string host, string user, string pwd)
        {
            string[] arr = host.Split(':');
            string ip = arr[0];
            int port = 22;
            if (arr.Length > 1) port = Int32.Parse(arr[1]);

            JSch jsch = new JSch();
            m_session = jsch.getSession(user, ip, port);
            ShellUserInfo ui = new ShellUserInfo();
            ui.setPassword(pwd);
            m_session.setUserInfo(ui);
        }
        //----------------------------------------------------------
        public bool Connected
        {
            get { return m_session.isConnected(); }
        }
        //-----------------------------------------------------------
        public bool Connect()
        {
            try
            {
                if (!Connected)
                {
                    m_session.connect();
                    m_channel = m_session.openChannel("sftp");
                    m_channel.connect();
                    m_sftp = (ChannelSftp)m_channel;
                }
                return true;
            }
            catch
            {
                return false;
            }
        }
        //------------------------------------------------------------
        public void Disconnect()
        {
            if (Connected)
            {
                m_channel.disconnect();
                m_session.disconnect();
            }
        }
        //------------------------------------------------------------
        public bool Put(string localPath, string remotePath)
        {
            try
            {
                Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(localPath);
                Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(remotePath);
                m_sftp.put(src, dst);

                return true;
            }
            catch
            {
                return false;
            }
        }
        //------------------------------------------------------------
        public bool Get(string remotePath, string localPath)
        {
            try
            {
                Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(remotePath);
                Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(localPath);
                m_sftp.get(src, dst);

                return true;
            }
            catch
            {
                return false;
            }
        }
        //------------------------------------------------------------
        public bool Delete(string remoteFile)
        {
            try
            {
                m_sftp.rm(remoteFile);
                return true;
            }
            catch
            {
                return false;
            }
        }
        //------------------------------------------------------------
        public ArrayList GetFileList(string remotePath)
        {
            try
            {
                Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(remotePath);
                ArrayList objList = new ArrayList();
                foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry qqq in vvv)
                {
                    string sss = qqq.getFilename();
                    objList.Add(sss);
                }
                return objList;
            }
            catch
            {
                return null;
            }
        }
        //------------------------------------------------------------
        public void Mkdir(string parentDir, string dirName)
        {
            if (dirName == "") return;

            //  去除最右边的 '/'。
            Int32 len = parentDir.Length;
            if( parentDir[len-1] == '/' )
            {
                parentDir.Remove(len - 1);
            }

            ArrayList aList = this.GetFileList(parentDir);

            if (aList.Contains(dirName)) return;
            m_sftp.mkdir(parentDir + "/" + dirName);
        }
    }
    //------------------------------------------------------------
    //  Class ShellUserInfo 登录验证信息 
    //------------------------------------------------------------
    class ShellUserInfo : UserInfo
    {
        String passwd;
        public String getPassword() { return passwd; }
        public void setPassword(String passwd) { this.passwd = passwd; }

        public String getPassphrase() { return null; }
        public bool promptPassphrase(String message) { return true; }

        public bool promptPassword(String message) { return true; }
        public bool promptYesNo(String message) { return true; }
        public void showMessage(String message) { }
    }
    //------------------------------------------------------------
}
  1. 在原来的 VB.NET 项目中添加引用 JasperSFTP。
    在这里插入图片描述
  2. 然后在需要使用 SFTP 的 Form 中建立 SFTPHelper 类。范例如下:
Imports JasperSFTP

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim sftp As SFTPHelper = New SFTPHelper("xxx.xxx.xxx.xxx", "my-account", "my-password")
        sftp.Connect()

        If sftp.Put("E:\temp\CC.jpg", "/var/www/html/") Then
            Label1.Text = "OK!"
        Else
            Label1.Text = "Fail!"
        End If
        sftp.Disconnect()
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim imgFile As String = Application.StartupPath + "\TempCC.jpg"
        Label1.Text = imgFile

        Dim sftp As SFTPHelper = New SFTPHelper("xxx.xxx.xxx.xxx", "my-account", "my-password")
        sftp.Connect()
        If sftp.Get("/var/www/html/CC.jpg", imgFile) Then
            PictureBox1.Image = Image.FromFile(imgFile)
            PictureBox1.Refresh()
        Else
            Label1.Text = "Fail!"
        End If
        sftp.Disconnect()
    End Sub

End Class

结语:

以前就知道 .NET 中可以混合不同程序语言,只是一直没尝试过,手上这个项目就是 VB.NET 混合 C# 及 C++,也才会想尝试这样的解决方案,结果蛮令人满意的,至少不用纠结将 C# 改成 VB.NET。

参考:
C#通过SFTP协议操作文件
SharpSSH

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论

打赏作者

jasper_ding

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值