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;
}
}
}
}