c# SftpHelper 安全文件传输

本文介绍了一个SFTP操作类SftpHelper,提供了SFTP连接、断开、文件上传、下载、改名、删除等功能,适用于使用Renci.SshNet库进行SFTP文件传输的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值