由于公司需求,我们可能需要去远端的Linux服务器上下载数据文件,在本地进行处理加工得到我们想要的数据。本文件主要介绍.NET(C#) 中,通过sftp(SSH.NET)从服务器下载文件方法及示例代码。

1、SSH.NET安装引用

使用Nuget管理工具搜索"SSH.NET"=>找到选择"安装"

相关文档VS(Visual Studio)中Nuget的使用

2、使用SFTP下载文件

1) SFtp操作类封装

using Renci.SshNet;
using Renci.SshNet.Sftp;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
namespace ConsoleApplication1
{
	public class SFtp
	{
		private SftpClient sftp;
        /// <summary>
        /// 连接状态
        /// </summary>
		public bool Connected
		{
			get
			{
				return this.sftp.IsConnected;
			}
		}
        /// <summary>
        /// 
        /// </summary>
        /// <param name="host">sftp的IP</param>
        /// <param name="port">sftp的端口</param>
        /// <param name="username">sftp的帐户</param>
        /// <param name="password">sftp的密码</param>
		public SFtp(string host, int port, string username, string password)
		{
			this.sftp = new SftpClient(host, port, username, password);
		}
        /// <summary>
        /// 连接sftp服务器
        /// </summary>
        /// <returns>连接状态</returns>
		public bool Connect()
		{
			bool result;
			try
			{
				bool flag = !this.Connected;
				if (flag)
				{
					this.sftp.Connect();
				}
				result = true;
			}
			catch (Exception ex)
			{
				throw new Exception(string.Format("连接SFTP失败,原因:{0}", ex.Message));
			}
			return result;
		}
        /// <summary>
        /// 断开连接
        /// </summary>
		public void Disconnect()
		{
			try
			{
				bool flag = this.sftp != null && this.Connected;
				if (flag)
				{
					this.sftp.Disconnect();
				}
			}
			catch (Exception ex)
			{
				throw new Exception(string.Format("断开SFTP失败,原因:{0}", ex.Message));
			}
		}
        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="localPath">本地文件路径</param>
        /// <param name="remotePath">服务器端文件路径</param>
		public void Put(string localPath, string remotePath)
		{
			try
			{
				using (FileStream fileStream = File.OpenRead(localPath))
				{
					this.Connect();
					this.sftp.UploadFile(fileStream, remotePath, null);
					this.Disconnect();
				}
			}
			catch (Exception ex)
			{
				throw new Exception(string.Format("SFTP文件上传失败,原因:{0}", ex.Message));
			}
		}
        /// <summary>
        /// 上传文字字节数据
        /// </summary>
        /// <param name="fileByteArr">文件内容字节</param>
        /// <param name="remotePath">上传到服务器的路径</param>
		public void Put(byte[] fileByteArr, string remotePath)
		{
			try
			{
				Stream input = new MemoryStream(fileByteArr);
				this.Connect();
				this.sftp.UploadFile(input, remotePath, null);
				this.Disconnect();
			}
			catch (Exception ex)
			{
				throw new Exception(string.Format("SFTP文件上传失败,原因:{0}", ex.Message));
			}
		}
        /// <summary>
        /// 将sftp服务器的文件下载本地
        /// </summary>
        /// <param name="remotePath">服务器上的路径</param>
        /// <param name="localPath">本地的路径</param>
		public void Get(string remotePath, string localPath)
		{
			try
			{
				this.Connect();
				byte[] bytes = this.sftp.ReadAllBytes(remotePath);
				this.Disconnect();
				File.WriteAllBytes(localPath, bytes);
			}
			catch (Exception ex)
			{
				throw new Exception(string.Format("SFTP文件获取失败,原因:{0}", ex.Message));
			}
		}
        /// <summary>
        ///  删除ftp服务器上的文件
        /// </summary>
        /// <param name="remoteFile">服务器上的路径</param>
		public void Delete(string remoteFile)
		{
			try
			{
				this.Connect();
				this.sftp.Delete(remoteFile);
				this.Disconnect();
			}
			catch (Exception ex)
			{
				throw new Exception(string.Format("SFTP文件删除失败,原因:{0}", ex.Message));
			}
		}
        /// <summary>
        /// 获取ftp服务器上指定路径上的指定前缀的文件名列表
        /// </summary>
        /// <param name="remotePath">服务器上的路径</param>
        /// <param name="fileSuffix">文件名前缀</param>
        /// <returns></returns>
        public List<string> GetFileList(string remotePath, string fileSuffix)
		{
			List<string> result;
			try
			{
				this.Connect();
				IEnumerable<SftpFile> enumerable = this.sftp.ListDirectory(remotePath, null);
				this.Disconnect();
                result = new List<string>();
				foreach (SftpFile current in enumerable)
				{
					string name = current.Name;
					bool flag = name.Length > fileSuffix.Length + 1 && fileSuffix == name.Substring(name.Length - fileSuffix.Length);
					if (flag)
					{
						result.Add(name);
					}
				}
			}
			catch (Exception ex)
			{
				throw new Exception(string.Format("SFTP文件列表获取失败,原因:{0}", ex.Message));
			}
			return result;
		}
        /// <summary>
        /// ftp服务器端文件移动
        /// </summary>
        /// <param name="oldRemotePath">原来服务器上路径</param>
        /// <param name="newRemotePath">移动后服务器上新路径</param>
		public void Move(string oldRemotePath, string newRemotePath)
		{
			try
			{
				this.Connect();
				this.sftp.RenameFile(oldRemotePath, newRemotePath);
				this.Disconnect();
			}
			catch (Exception ex)
			{
				throw new Exception(string.Format("SFTP文件移动失败,原因:{0}", ex.Message));
			}
		}
	}

2) 下载Linux服务器端文件

var ftp =new SFtp("192.168.31.33",22,"admin","admin");
sftp.Connect();
ftp.Get("/home/admin/cjavapy.db",@"F:\Home\cjavapy.db");
ftp.Disconnect();

相关文档:

.NET Core通过SSH.NET实现sftp通过ssh上传下载文件代码

(C#)SSH.NET sftp常用操作工具类代码(连接,上传,下载,删除,移动)

推荐文档