c# 使用Renci.SshNet 进行sftp下载文件

首先在Nuget package下载第三方dll:
在这里插入图片描述

using Renci.SshNet;
using Renci.SshNet.Sftp;
using System;
using System.IO;

namespace Test
{
    public class SFTPHelper
    {
        private SftpClient sftp;
        public bool Connected { get { return sftp.IsConnected; } }
        public void InitClient(string server, string port, string user, string pwd)
        {
            try
            {
                sftp = new SftpClient(server, Int32.Parse(port), user, pwd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public bool Connect()
        {
            try
            {
                if (!Connected)
                {
                    sftp.Connect();
                }
                return true;
            }
            catch (Exception ex)
            {
                throw ex;
                return false;
            }
        }
        public void Disconnect()
        {
            try
            {
                if (sftp != null && Connected)
                {
                    sftp.Disconnect();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void ArchiveFile(string oldPath, string newPath, string fileName)
        {
            try
            {
                if (Connect())
                {
                    if (!sftp.Exists(newPath))
                        sftp.CreateDirectory(newPath);
                    sftp.RenameFile(oldPath + "/" + fileName, newPath + "/" + 
                        Path.GetFileNameWithoutExtension(fileName) + "_" + 
                        DateTime.Now.ToString("yyyyMMddHHmmssffff") + Path.GetExtension(fileName));
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void DownloadFiles(string server, string port, string user, string password,
            string localPath, string remotePath, string archiveFilePath, string fileType, 
            bool recursive, bool archive)
        {
            try
            {
                InitClient(server, port, user, password);
                if (Connect())
                {
                    var files = sftp.ListDirectory(remotePath);
                    foreach (var file in files)
                    {
                        if (!file.Name.Equals("..") && !file.Name.Equals("."))
                        {
                            RecursiveFiles(file, fileType, localPath, remotePath, archiveFilePath, 
                                recursive, archive);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                Disconnect();
            }
        }
        public void RecursiveFiles(SftpFile file, string fileType, string localPath, 
            string remotePath, string archiveFilePath, bool recursive, bool archive)
        {
            try
            {
                if (file.IsDirectory)
                {
                    if (recursive)
                    {
                        var recursiveFiles = sftp.ListDirectory(file.FullName);
                        foreach (var recursiveFile in recursiveFiles)
                        {
                            if (!recursiveFile.Name.Equals("..") && !recursiveFile.Name.Equals("."))
                            {
                                RecursiveFiles(recursiveFile, fileType, localPath, file.FullName, 
                                    archiveFilePath, recursive, archive);
                            }
                        }
                    }
                }
                else
                {
                    ProcessFiles(file,fileType,localPath,remotePath,archiveFilePath,archive);
                }
            }
            catch (Exception ex)
            {
throw ex;
            }
        }
        public void ProcessFiles(SftpFile file, string fileType, string localPath, 
            string remotePath, string archiveFilePath, bool archive)
        {
            string fileName = file.Name;
            if (!Directory.Exists(localPath))
                Directory.CreateDirectory(localPath);
            try
            {
                if (fileType.Equals("*") || fileType.Equals("*.*"))
                {
                    WriteFileToLocalStorage(file, fileName, localPath, remotePath, archiveFilePath, archive);
                }
                else
                {
                    string[] fileTypes = fileType.Split(',');
                    foreach (var type in fileTypes)
                    {
                        if (type.ToLower().Equals(Path.GetExtension(fileName).ToLower()))
                        {
                            WriteFileToLocalStorage(file,fileName,localPath,remotePath,archiveFilePath, archive);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void WriteFileToLocalStorage(SftpFile file, string fileName, string localPath, 
            string remotePath, string archiveFilePath, bool archive)
        {
            try
            {
                string destinationPath = string.Format(@"{0}\{1}", localPath, file.Name);
                sftpStream = sftp.OpenRead(file.FullName);
                if (sftpStream.Length > 0)
                {
                    sfileStream = File.Create(destinationPath, (int)sftpStream.Length);
                    byte[] buffer = new byte[200 * 1024];
                    int count;
                    while ((count = sftpStream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        sfileStream.Write(buffer, 0, count);
                    }
                }
                if (archive && !string.IsNullOrEmpty(archiveFilePath))
                {
                    ArchiveFile(remotePath, archiveFilePath, fileName);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (sftpStream != null)
                {
                    sftpStream.Flush();
                    sftpStream.Close();
                }
                if (sfileStream != null)
                {
                    sfileStream.Flush();
                    sfileStream.Close();
                }
            }
        }
    }
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值