using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Renci.SshNet;
using System.IO;
using System.Threading;
using System.Net;
/*****************************
* 概要:Sftp操作
* 设计者:DuanXuWen
* 设计时间:20180309
* 版本:0.1
* 修改者:
* 修改时间:
* ***************************/
namespace Common
{
public class SftpHelper
{
/// <summary>
/// Sftp连接
/// </summary>
public SftpClient SftpClient = null;
/// <summary>
/// Sftp密钥
/// </summary>
public PrivateKeyFile PrivateKeyFile = null;
/// <summary>
/// 无参构造
/// </summary>
public SftpHelper() { }
/// <summary>
/// 有参构造
/// </summary>
/// <param name=\"sftpIP\">sftp服务器名或IP</param>
/// <param name=\"sftpPort\">端口,默认22</param>
/// <param name=\"sftpName\">用户名</param>
/// <param name=\"privateKey\">用户私钥</param>
/// <param name=\"sftpPwd\">密码:(如不需密码,可不传)</param>
public SftpHelper(string sftpIP, string sftpName, Stream keyStream, string sftpPwd, int? sftpPort)
{
try
{
if (string.IsNullOrEmpty(sftpPwd))
{
//使用秘钥验证
PrivateKeyFile = new PrivateKeyFile(keyStream);
}
else
{
//使用带口令的秘钥验证
PrivateKeyFile = new PrivateKeyFile(keyStream, sftpPwd);
}
if (sftpPort.HasValue)
{
//设置端口
SftpClient = new SftpClient(sftpIP, sftpPort.Value, sftpName, PrivateKeyFile);
}
else
{
//默认端口
SftpClient = new SftpClient(sftpIP, sftpName, PrivateKeyFile);
}
if (SftpClient != null)
{
//设置重试尝试之间的延迟(秒)。
SftpClient.ConnectionInfo.RetryAttempts = 5;
//生存时间
SftpClient.ConnectionInfo.Timeout = new TimeSpan(0, 3, 0);
}
}
catch (Exception ex)
{
string msg = \"Sftp初始化相关错误!详情:Sftp服务器IP\" + sftpIP + \"用户名\" + sftpName;
string logAddress = System.Windows.Forms.Application.StartupPath + \"\\\\Log\\\\ErrorMsg\\\\\" + DateTime.Now.ToString(\"yyyyMMdd\") + \".log\";
LogHelper.WriteLog(ex, logAddress, true, msg);
}
}
/// <summary>
/// SFTP连接
/// </summary>
/// <returns></returns>
public bool SftpConnect()
{
try
{
//是否可连接
if (SftpClient != null)
{
//判断当前是否已连接
if (!SftpClient.IsConnected)
{
SftpClient.Connect();
}
//返回当前连接状态
return SftpClient.IsConnected;
}
return false;
}
catch (Exception ex)
{
string msg = \"Sftp连接相关错误!\";
string logAddress = System.Windows.Forms.Application.StartupPath + \"\\\\Log\\\\ErrorMsg\\\\\" + DateTime.Now.ToString(\"yyyyMMdd\") + \".log\";
LogHelper.WriteLog(ex, logAddress, true, msg);
return false;
}
}
/// <summary>
/// SFTP关闭
/// </summary>
public void DisConnect()
{
try
{
if (SftpClient != null)
{
if (SftpClient.IsConnected)
{
SftpClient.Disconnect();
SftpClient.Dispose();
SftpClient = null;
}
}
}
catch (Exception ex)
{
string msg = \"Sftp关闭时相关错误!\";
string logAddress = System.Windows.Forms.Application.StartupPath + \"\\\\Log\\\\ErrorMsg\\\\\" + DateTime.Now.ToString(\"yyyyMMdd\") + \".log\";
LogHelper.WriteLog(ex, logAddress, true, msg);
}
}
/// <summary>
/// 获取文件列表
/// </summary>
/// <param name=\"path\">路径获取所有文件</param>
/// <param name=\"catalogue\">路径获取某个文件</param>
/// <returns></returns>
public List<string> GetFileList(string path, string catalogue)
{
try
{
//存放列表
List<string> filesList = new List<string>();
if (SftpClient != null)
{
if (!SftpClient.IsConnected)
{
SftpClient.Connect();
}
//sftp.ChangeDirectory(catalogue);
SftpClient.ListDirectory(path).ToList().ForEach(f =>
{
filesList.Add(f.FullName);
});
return filesList;
}
return null;
}
catch (Exception ex)
{
string msg = \"Sftp获取文件相关错误!\";
string logAddress = System.Windows.Forms.Application.StartupPath + \"\\\\Log\\\\ErrorMsg\\\\\" + DateTime.Now.ToString(\"yyyyMMdd\") + \".log\";
LogHelper.WriteLog(ex, logAddress, true, msg);
return null;
}
}
/// <summary>
/// 下载文件
/// </summary>
/// <param name=\"remoteFileName\">包含全路径的服务器端文件名</param>
/// <param name=\"localFileName\">本地保存的文件名</param>
/// <param name=\"catalogue\">下载文件存放的路径</param>
/// <returns></returns>
public bool Get(string remoteFileName, string localFileName, string catalogue)
{
try
{
if (SftpClient != null)
{
if (!SftpClient.IsConnected)
{
SftpClient.Connect();
}
SftpClient.ChangeDirectory(catalogue);
FileStream fs = File.OpenWrite(localFileName);
SftpClient.DownloadFile(remoteFileName, fs);
fs.Close();
return true;
}
return false;
}
catch (Exception ex)
{
string msg = \"Sftp下载文件相关错误!详情:下载地址:\" + remoteFileName + \"存放地址:\" + catalogue + \"文件名称:\" + localFileName;
string logAddress = System.Windows.Forms.Application.StartupPath + \"\\\\Log\\\\ErrorMsg\\\\\" + DateTime.Now.ToString(\"yyyyMMdd\") + \".log\";
LogHelper.WriteLog(ex, logAddress, true, msg);
return false;
}
}
/// <summary>
/// 上传文件
/// </summary>
/// <param name=\"localFileName\">待上传的文件路径</param>
/// <param name=\"stream\">待上传的文件流</param>
/// <param name=\"remoteFileName\">服务器端文件名</param>
/// <param name=\"catalogue\">上传文件存放的路径</param>
/// <returns></returns>
public bool Put(Stream stream, string remoteFileName, string catalogue)
{
try
{
if (SftpClient != null)
{
if (!SftpClient.IsConnected)
{
SftpClient.Connect();
}
//指定当前工作目录
SftpClient.ChangeDirectory(catalogue);
SftpClient.UploadFile(stream, remoteFileName, true);//true 同名文件将被覆盖
stream.Close();
return true;
}
return false;
}
catch (Exception ex)
{
string msg = \"Sftp上传文件相关错误!详情:上传地址:\" + catalogue + \"文件名称:\" + remoteFileName;
string logAddress = System.Windows.Forms.Application.StartupPath + \"\\\\Log\\\\ErrorMsg\\\\\" + DateTime.Now.ToString(\"yyyyMMdd\") + \".log\";
LogHelper.WriteLog(ex, logAddress, true, msg);
return false;
}
}
/// <summary>
/// 上传文件
/// </summary>
/// <param name=\"localFileName\">待上传的文件路径</param>
/// <param name=\"stream\">待上传的文件流</param>
/// <param name=\"remoteFileName\">服务器端文件名</param>
/// <param name=\"catalogue\">上传文件存放的路径</param>
/// <returns></returns>
public bool Put(string localFileName, string remoteFileName, string catalogue)
{
try
{
if (SftpClient != null)
{
if (!SftpClient.IsConnected)
{
SftpClient.Connect();
}
//指定上传路径
SftpClient.ChangeDirectory(catalogue);
FileStream fs = File.OpenRead(localFileName);//通过本地路径进行读取流
SftpClient.UploadFile(fs, remoteFileName, true);//true 同名文件将被覆盖
fs.Close();
return true;
}
return false;
}
catch (Exception ex)
{
string msg = \"Sftp上传文件相关错误!详情:本地文件地址:\" + localFileName + \"上传地址:\" + catalogue + \"文件名称:\" + remoteFileName;
string logAddress = System.Windows.Forms.Application.StartupPath + \"\\\\Log\\\\ErrorMsg\\\\\" + DateTime.Now.ToString(\"yyyyMMdd\") + \".log\";
LogHelper.WriteLog(ex, logAddress, true, msg);
return false;
}
}
/// <summary>
/// 创建文件夹
/// </summary>
/// <param name=\"SFtpPath\">文件夹名</param>
/// <param name=\"catalogue\">文件夹路径</param>
/// <returns></returns>
public bool DirectoryExist(string sftpPath, string catalogue)
{
try
{
if (SftpClient != null)
{
if (!SftpClient.IsConnected)
{
SftpClient.Connect();
}
//获取路径下文件夹
var list = SftpClient.ListDirectory(catalogue);
//判断是否存在文件夹
if (list.Where(x => x.IsDirectory && x.Name == sftpPath).Count() == 0)
{
//创建文件夹
SftpClient.CreateDirectory(sftpPath);
return true;
}
}
return false;
}
catch (Exception ex)
{
string msg = \"Sftp创建文件夹相关错误!详情:创建地址:\" + catalogue + \"文件夹名称:\" + sftpPath;
string logAddress = System.Windows.Forms.Application.StartupPath + \"\\\\Log\\\\ErrorMsg\\\\\" + DateTime.Now.ToString(\"yyyyMMdd\") + \".log\";
LogHelper.WriteLog(ex, logAddress, true, msg);
return false;
}
}
/// <summary>
/// 文件改名
/// </summary>
/// <param name=\"orgFileName\">包含全路径的源文件名</param>
/// <param name=\"newFileName\">包含全路径的新文件名</param>
/// <param name=\"catalogue\">文件路径</param>
/// <returns></returns>
public bool Rename(string orgFileName, string newFileName, string catalogue)
{
try
{
if (SftpClient != null)
{
if (!SftpClient.IsConnected)
{
SftpClient.Connect();
}
SftpClient.RenameFile(orgFileName, newFileName);
return true;
}
return false;
}
catch (Exception ex)
{
string msg = \"Sftp文件改名相关错误!详情:原文件路径:\" + orgFileName + \"新文件路径:\" + newFileName;
string logAddress = System.Windows.Forms.Application.StartupPath + \"\\\\Log\\\\ErrorMsg\\\\\" + DateTime.Now.ToString(\"yyyyMMdd\") + \".log\";
LogHelper.WriteLog(ex, logAddress, true, msg);
return false;
}
}
/// <summary>
/// 删除文件
/// </summary>
/// <param name=\"fileName\">文件名</param>
/// <param name=\"catalogue\">文件路径</param>
/// <returns></returns>
public bool Delete(string fileName, string catalogue)
{
try
{
if (SftpClient != null)
{
if (!SftpClient.IsConnected)
{
SftpClient.Connect();
}
SftpClient.ChangeDirectory(catalogue);
SftpClient.DeleteFile(fileName);
return true;
}
return false;
}
catch (Exception ex)
{
string msg = \"Sftp删除文件相关错误!详情:文件名:\" + fileName + \"文件路径:\" + catalogue;
string logAddress = System.Windows.Forms.Application.StartupPath + \"\\\\Log\\\\ErrorMsg\\\\\" + DateTime.Now.ToString(\"yyyyMMdd\") + \".log\";
LogHelper.WriteLog(ex, logAddress, true, msg);
return false;
}
}
}
}
继续阅读与本文标签相同的文章
javascript引用类型--Object
-
凯撒加密法
2026-05-18栏目: 教程
-
第一次对外出售芯片!华为宣布出售海思Balong 711
2026-05-18栏目: 教程
-
又一外卖巨头躺平,曾让美团饿了么后背发凉,网友:头回听说
2026-05-18栏目: 教程
-
SpaceX公司刚刚申请在轨道上再运行3万颗星链卫星
2026-05-18栏目: 教程
-
第三讲,Ceph内部构件
2026-05-18栏目: 教程
