首页 > 编程语言 >C#实现SSH、SCP、FTP等操作

C#实现SSH、SCP、FTP等操作

时间:2023-09-16 17:26:16浏览次数:41  
标签:FTP Exception string Format C# SFTP SSH Message ex

C#实现SSH、SCP、FTP等操作

C#没有自带的SSH、SCP、FTP等操作的方法库,自己编写又太麻烦,这里将使用第三方Renci.SshNet.dll动态链接库实现这些操作

 

一、获取RENCI.SSHNET.DLL


 

二、将RENCI.SSHNET.DLL添加进C#工程


我使用visual studio 2015作为IDE,将Renci.SshNet.dll添加进C#工程并调用的方法如下:

1. 添加引用

添加引用

 

如上图所示,右键解决方案下项目中的引用,选择添加引用,在弹窗中选择浏览按钮,找到Renci.SshNet.dll动态链接库,点击添加得到如下图所示


这里写图片描述

 

勾选你添加的Renci.SshNet.dll,点击确定

2. 调用

在添加了引用后直接使用下面的语句即可调用Renci.SshNet.dll动态链接库

using Renci.SshNet;
  • 1

三、使用RENCI.SSHNET.DLL


下面以SCP为例,FTP的二次封装可以参考开头给出的博文

SshNet动态链接库已经将FTP的基本功能封装成一个SCP类,在官方的说明文档中的命名空间目录下可以找到SCP类的说明,包括方法、属性、事件等。在使用中,我根据需要对这些方法、属性等进行了二次封装。

 

public class SFTPHelper
{
#region 字段或属性
private SftpClient sftp;
/// <summary>
/// SFTP连接状态
/// </summary>
public bool Connected { get { return sftp.IsConnected; } }
#endregion

#region 构造
/// <summary>
/// 构造
/// </summary>
/// <param name="ip">IP</param>
/// <param name="port">端口</param>
/// <param name="user">用户名</param>
/// <param name="pwd">密码</param>
public SFTPHelper(string ip, string port, string user, string pwd)
{
sftp = new SftpClient(ip, Int32.Parse(port), user, pwd);
//Connect();
}

//~SFTPHelper()
//{
// Disconnect();
//}
#endregion

#region 连接SFTP
/// <summary>
/// 连接SFTP
/// </summary>
/// <returns>true成功</returns>
public bool Connect()
{
try
{
if (!Connected)
{
sftp.Connect();
}
return true;
}
catch (Exception ex)
{
//return false;
// TxtLog.WriteTxt(CommonMethod.GetProgramName(), string.Format("连接SFTP失败,原因:{0}", ex.Message));
throw new Exception(string.Format("连接SFTP失败,原因:{0}", ex.Message));
//连接SFTP失败,原因:An established connection was aborted by the software in your host machine.
}
}
#endregion

#region 断开SFTP
/// <summary>
/// 断开SFTP
/// </summary>
public void Disconnect()
{
try
{
if (sftp != null && Connected)
{
sftp.Disconnect();
}
}
catch (Exception ex)
{
// TxtLog.WriteTxt(CommonMethod.GetProgramName(), string.Format("断开SFTP失败,原因:{0}", ex.Message));
throw new Exception(string.Format("断开SFTP失败,原因:{0}", ex.Message));
}
}
#endregion

#region SFTP上传文件
/// <summary>
/// SFTP上传文件
/// </summary>
/// <param name="localPath">本地路径</param>
/// <param name="remotePath">远程路径</param>
public void Put(string localPath, string remotePath)
{
try
{
using (var file = File.OpenRead(localPath))
{
Connect();
sftp.UploadFile(file, remotePath);
Disconnect();
}
}
catch (Exception ex)
{
// TxtLog.WriteTxt(CommonMethod.GetProgramName(), string.Format("SFTP文件上传失败,原因:{0}", ex.Message));
throw new Exception(string.Format("SFTP文件上传失败,原因:{0}", ex.Message));
}
}
#endregion

#region SFTP获取文件
/// <summary>
/// SFTP获取文件
/// </summary>
/// <param name="remotePath">远程路径</param>
/// <param name="localPath">本地路径</param>
public void Get(string remotePath, string localPath)
{
try
{
Connect();
var byt = sftp.ReadAllBytes(remotePath);
Disconnect();
File.WriteAllBytes(localPath, byt);
}
catch (Exception ex)
{
// TxtLog.WriteTxt(CommonMethod.GetProgramName(), string.Format("SFTP文件获取失败,原因:{0}", ex.Message));
throw new Exception(string.Format("SFTP文件获取失败,原因:{0}", ex.Message));
}

}
#endregion

#region 删除SFTP文件
/// <summary>
/// 删除SFTP文件
/// </summary>
/// <param name="remoteFile">远程路径</param>
public void Delete(string remoteFile)
{
try
{
Connect();
sftp.Delete(remoteFile);
Disconnect();
}
catch (Exception ex)
{
// TxtLog.WriteTxt(CommonMethod.GetProgramName(), string.Format("SFTP文件删除失败,原因:{0}", ex.Message));
throw new Exception(string.Format("SFTP文件删除失败,原因:{0}", ex.Message));
}
}
#endregion

private int day(string name)
{
if (!name.Contains("_"))
return 0;
name = name.Split('_')[1];
if (name.Length < 8)
return 0;
name = name.Substring(0, 8);
DateTime start = DateTime.ParseExact(name, "yyyyMMdd", null);
DateTime end = Convert.ToDateTime(DateTime.Now.ToShortDateString());
TimeSpan sp = end.Subtract(start);
return sp.Days;
}

#region 获取SFTP文件列表
/// <summary>
/// 获取SFTP文件列表
/// </summary>
/// <param name="remotePath">远程目录</param>
/// <param name="fileSuffix">文件后缀</param>
/// <returns></returns>
public ArrayList GetFileList(string remotePath, string fileSuffix)
{
try
{
Connect();
var files = sftp.ListDirectory(remotePath);
Disconnect();
var objList = new ArrayList();
foreach (var file in files)
{
/*DateTime start = Convert.ToDateTime(file.LastWriteTime.ToShortDateString());

DateTime end = Convert.ToDateTime(DateTime.Now.ToShortDateString());
TimeSpan sp = end.Subtract(start);*/
string name = file.Name;
if (day(name) != 1)
continue;
if (name.Length > (fileSuffix.Length + 1) && fileSuffix == name.Substring(name.Length - fileSuffix.Length))
{
objList.Add(name);
}
}
return objList;
}
catch (Exception ex)
{
// TxtLog.WriteTxt(CommonMethod.GetProgramName(), string.Format("SFTP文件列表获取失败,原因:{0}", ex.Message));
throw new Exception(string.Format("SFTP文件列表获取失败,原因:{0}", ex.Message));
}
}
#endregion

#region 移动SFTP文件
/// <summary>
/// 移动SFTP文件
/// </summary>
/// <param name="oldRemotePath">旧远程路径</param>
/// <param name="newRemotePath">新远程路径</param>
public void Move(string oldRemotePath, string newRemotePath)
{
try
{
Connect();
sftp.RenameFile(oldRemotePath, newRemotePath);
Disconnect();
}
catch (Exception ex)
{
// TxtLog.WriteTxt(CommonMethod.GetProgramName(), string.Format("SFTP文件移动失败,原因:{0}", ex.Message));
throw new Exception(string.Format("SFTP文件移动失败,原因:{0}", ex.Message));
}
}
#endregion


public static int DownloadFtp(string filePath, string localPath, string fileName, string ftpServerIP, string ftpPort, string ftpUserID, string ftpPassword)
{
string localFileName = localPath + "/" + fileName;
if (!Directory.Exists(localPath))
{
Directory.CreateDirectory(localPath);
}
string remoteFileName = filePath+"/"+fileName;

try
{
if (File.Exists(localFileName))
{
File.Delete(localFileName);
}
using (var sftp = new SftpClient(ftpServerIP, Convert.ToInt32(ftpPort), ftpUserID, ftpPassword))
{
sftp.Connect();

using (var file = File.OpenWrite(localFileName))
{
sftp.DownloadFile(remoteFileName, file);
}

sftp.Disconnect();
//Log.getInstace().WriteSysInfo("下载文件{localFileName}成功", "info");

Console.WriteLine("下载文件成功,文件路径: "+ localFileName);
return 0;
}
}
catch (Exception e)
{
throw new Exception(string.Format("SFTP文件移动失败,原因:{0}", e.Message));
return -2;
}
}

}
}

标签:FTP,Exception,string,Format,C#,SFTP,SSH,Message,ex
From: https://www.cnblogs.com/lhxsoft/p/17706973.html

相关文章

  • atcoder313C
    313C题目概述:给定序列A,可以任选两个数,使其中一个数加1,另一个数减1.可以通过任意次操作,问需要至少多少次操作,才能使A中最大数和最小数差值不超过1。解题思路:将该题进行抽象转化:1.我们需要将A序列转化为B序列,sumB=sumA。操作次数为:\(\frac{\sum\limits_{i}^n|a_i-b_i|}{2}\)2......
  • The POM for com.xubo:service_base:jar:0.0.1-SNAPSHOT is missing, no dependency i
    报错信息[INFO]Scanningforprojects...[INFO][INFO]------------------------<com.xubo:service_edu>------------------------[INFO]Buildingservice_edu0.0.1-SNAPSHOT[INFO]--------------------------------[jar]---------------------------------[......
  • CF1827A
    CountingOrders题面翻译求有多少种重新排列\(a\)的方式,使得对于任意\(1\lei\len\),都满足\(a_i>b_i\),结果对\(10^9+7\)取模。\(1\len\le2\times10^5,1\lea_i,b_i\le10^9\),保证\(a_i\)互不相同。题目描述Youaregiventwoarrays$a$and$b$eachconsis......
  • XMind2TestCase安装问题
     安装完成了XMind2TestCase之后,在命令端检查安装是否成功,报错:C:\Users\Administrator>xmind2testcaseTraceback(mostrecentcalllast): File"C:\Softwares\Python\Scripts\xmind2testcase-script.py",line33,in<module> sys.exit(load_entry_point('......
  • easyexcel导出csv格式怎么分sheet页
    在EasyExcel中,导出CSV格式并分多个Sheet页的方式与导出Excel格式基本相同。以下是使用EasyExcel导出CSV并分Sheet页的示例代码:publicvoidexportToCsvWithMultipleSheets(List<List<String>>data,List<String>sheetNames){try(CSVWritercsvWriter=new......
  • 无涯教程-JavaScript - ACOSH函数
    描述ACOSH函数返回数字的反双曲余弦值。反双曲余弦是其双曲余弦为数字的值。即ACOSH(COSH(数字))=数字语法ACOSH(number)争论Argument描述Required/OptionalNumberAnyrealnumberequaltoorgreaterthan1.Required适用性Excel2007,Excel2010,Excel2013,E......
  • Hyperledger Fabric开发之启动CouchDB作为状态数据库
    测试环境MacCatalinaDockerDesktop3.6.0HyperledgerFabric2.5.4CouchDB3.3.2简单分析当前版本的Fabric2.5.4默认支持的LevelDB仅能够实现存储简单的键值对数据,并且LevelDB与Peer节点并存于同一个操作系统进程中。CouchDB适用于存储JSON文件,并支持富查询和对更多数据类型的操......
  • Apache IoTDB开发系统之语法规则
    字面值常量该部分对IoTDB中支持的字面值常量进行说明,包括字符串常量、数值型常量、时间戳常量、布尔型常量和空值。字符串常量字符串是由单引号(')或双引号(")字符括起来的字符序列。示例如下:'astring'"anotherstring"字符串字面值的使用场景:INSERT 或者 SELECT 中用于表达 TE......
  • 5G速度网络瘫痪如何用CDN解决?
    随着5G的到来,我们可以享受到VR/AR、车联网、物联网等大流量应用带来的便利。5G将首先造就终端厂商。由于业务请求的涌入,终端设备——5G手机应该会阻塞网络,但目前的CDN不足以满足5G时代的应用需求。如何将5G网络添加到CDN网络?2019年加快网站CDN发展非常重要!如何解决5G速度网络......
  • JAX-WS开发webservice示例详解
    目录:概述实验环境服务端的实现客户端的实现[一]、概述JavaAPIforXMLWebServices(JAX-WS)是Java程序设计语言一个用来创建Web服务的API。在服务器端,用户只需要通过Java语言定义远程调用所需要实现的接口SEI(serviceendpointinterface),并提供相关的实现,通过调用JAX-WS的服务发......