最近需要通过SFTP来获取文件。

下面是我整理的相关信息。

以下只是大致代码,大家看看就行了。

我的是window service。每天会去下载文件。

1  下载 Renci.SshNet

通过 nuget查找 sshnet,下载Renci.SshNet。

我们可以看到一些常用方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Renci.SshNet;
using System.Collections;
using System.IO; namespace Terminal_CDMA
{ /// <summary>
/// SFTP操作类
/// </summary>
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);
}
#endregion #region 连接SFTP
/// <summary>
/// 连接SFTP
/// </summary>
/// <returns>true成功</returns>
public bool Connect()
{
try
{
if (!Connected)
{
sftp.Connect();
}
return true;
}
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>
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);
}
}
catch (Exception ex)
{
// TxtLog.WriteTxt(CommonMethod.GetProgramName(), string.Format("SFTP文件上传失败,原因:{0}", ex.Message));
throw new Exception(string.Format("SFTP文件上传失败,原因:{0}", ex.Message));
}
finally
{
Disconnect();
}
}
#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);
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));
}
finally
{
Disconnect();
} }
#endregion #region 重命名SFTP文件
/// <summary>
/// 重命名SFTP文件
/// <param name="oldFile">旧远程路径</param>
/// <param name="newFile">新远程路径</param>
/// </summary>
public void Rename_SFTP(string oldFilePath,string newFilePath)
{
try
{
Connect();
sftp.RenameFile(oldFilePath, newFilePath);
}
catch (Exception ex)
{
// TxtLog.WriteTxt(CommonMethod.GetProgramName(), string.Format("SFTP文件删除失败,原因:{0}", ex.Message));
throw new Exception(string.Format("SFTP文件删除失败,原因:{0}", ex.Message));
}
finally
{
Disconnect();
}
}
#endregion #region 删除SFTP文件
/// <summary>
/// 删除SFTP文件
/// </summary>
/// <param name="remoteFile">远程路径</param>
public void Delete(string remoteFile)
{
try
{
Connect();
sftp.Delete(remoteFile);
}
catch (Exception ex)
{
// TxtLog.WriteTxt(CommonMethod.GetProgramName(), string.Format("SFTP文件删除失败,原因:{0}", ex.Message));
throw new Exception(string.Format("SFTP文件删除失败,原因:{0}", ex.Message));
}
finally
{
Disconnect();
}
}
#endregion #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);
var objList = new ArrayList();
foreach (var file in files)
{
string name = file.Name;
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));
}
finally
{
Disconnect();
}
}
#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));
}
finally
{
Disconnect();
}
}
#endregion }
}

2  window service

public partial class Service1 : ServiceBase
{
DAL.DAL dal = new DAL.DAL();
public Service1()
{
InitializeComponent();
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
//运行
RunService();
} System.Timers.Timer timer1 = new System.Timers.Timer(MyConfig.interval);
static SFTPHelper sftp = new SFTPHelper(MyConfig.host, MyConfig.port, MyConfig.username, MyConfig.password);
protected override void OnStart(string[] args)
{
//正式
if (!MyConfig.IsDebug)
{
timer1.AutoReset = true;
timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);
timer1.Enabled = true;
}
} private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (DateTime.Now.Hour == MyConfig.timerStart)
{
RunService();
}
} public void RunService()
{
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
LogHelper.WriteLog(" <<==开始______________________" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "______________________==>>"); DataTable dt1 = UploadInboundPO();
DataTable dt2 = ReadSJ_SNAP();
DataTable dt3 = ReadSHP();
DataTable dt4 = ReadRcv_Results();
int UploadInboundPO_Count = dt1 == null?0: dt1.Rows.Count;
int ReadSJ_SNAP_Count = dt2 == null ? 0 : dt2.Rows.Count;
int ReadSHP_Count = dt3 == null ? 0 : dt3.Rows.Count;
int ReadRcv_Results_Count = dt4 == null ? 0 : dt4.Rows.Count;
SendEmail(dt1, dt2, dt3, dt4);
LogHelper.WriteLog(string.Format("---------------------InboundPO :{0}-----------------------", UploadInboundPO_Count));
LogHelper.WriteLog(string.Format("---------------------SJ_SNAP :{0}-----------------------", ReadSJ_SNAP_Count));
LogHelper.WriteLog(string.Format("---------------------SHP :{0}-----------------------", ReadSHP_Count));
LogHelper.WriteLog(string.Format("---------------------Rcv_Results :{0}-----------------------", ReadRcv_Results_Count));
LogHelper.WriteLog(" <<==结束______________________" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "______________________==>>"); Clear();
} //上传InboundPO
public DataTable UploadInboundPO()
{
try
{
//业务逻辑
}
catch (Exception ex)
{
LogHelper.WriteLog(ex.Message);
return null;
}
} //读取SJ_SNAP
public DataTable ReadSJ_SNAP()
{
try
{
//获取文件SJ_SNAP
sftp.Get(MyConfig.OutboundPath + MyConfig.fileName_SJ_SNAP, MyConfig.uploadFilePath_SJ_SNAP + MyConfig.fileName_SJ_SNAP);
}
catch (Exception ex)
{
LogHelper.WriteLog("SJ_SNAP.csv -- " + ex.Message);
return null;
}
 
//业务逻辑 return dt;
//发送邮件        
public void SendEmail(DataTable InboundPO, DataTable SJ_SNAP, DataTable SHP,DataTable Rcv_Results)        
{            
//生成邮件body            
//string emailHtml1 = InboundPO == null ? "" : dal.GetSJ_SNAP_Html(InboundPO);            
string emailHtml2 = SJ_SNAP == null ? "" : dal.GetSJ_SNAP_Html(SJ_SNAP);            
string emailHtml3 = SHP == null ? "" : dal.GetSHP_Html(SHP);            
//string emailHtml4 = Rcv_Results == null ? "" : dal.GetSJ_SNAP_Html(Rcv_Results);            
string[] files = { file_NewPath_InboundPO, file_NewPath_SJ_SNAP, file_NewPath_SHP, file_NewPath_Rcv_Results };            
//发送邮件            
EmailHelper.SendMailByEmail(files, DateTime.Now.ToShortDateString() + "的三聚库存", (emailHtml2+ emailHtml3), EmailHelper.emailReceiver.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries).ToList());        
}        
public void Clear()        
{            
file_NewPath_InboundPO = "";            
file_NewPath_SJ_SNAP = "";            
file_NewPath_SHP = "";            
file_NewPath_Rcv_Results = "";        
}        
protected override void OnStop()        
{            
//正式            
timer1.Enabled = false;        
}        
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)        
{            
try            
{                
Exception ex = e.ExceptionObject as Exception;                
string exStr = "\n" + "\n" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
+ ex.Message + "详细信息如下:\n"+ Environment.NewLine + "[InnerException]"
+ ex.InnerException + "\n"                                    
+ Environment.NewLine + "[Source]"
+ ex.Source + "\n"                                    
+ Environment.NewLine + "[TargetSite]"
+ ex.TargetSite + "\n"                                    
+ Environment.NewLine + "[StackTrace]"
+ ex.StackTrace + "\n";                
LogHelper.WriteLog(exStr);            
}            
catch { }            
finally { }        
}

C# SFTP的更多相关文章

  1. SFTP 命令列表以备查询

    Available commands: ascii Set transfer mode to ASCII binary Set transfer mode to binary cd path Chan ...

  2. Winscp开源的SSH|SFTP

    WinSCP 主要功能 图形用户界面 多语言与 Windows 完美集成(拖拽, URL, 快捷方式) 支持所有常用文件操作,支持基于 SSH-1.SSH-2 的 SFTP 和 SCP 协议 支持批处 ...

  3. virtualbox设置共享文件夹代替sftp同步代码

    通常的开发场景: 代码放在virtualbox上运行,本地的IDE通过sftp实现和虚拟机的代码同步. 有 一个不能避免的问题是,当使用git时,如果装在virtualbox端,那么每次virtual ...

  4. 【荐】如何规划 Nginx 网站目录的权限(用户,用户组,ssh,sftp)

    从上一篇文章:PHP网站(nginx.php-fpm.mysql) 用户权限解析,可以学习了解到,nginx 和 php-fpm 的用户是如何运作的. 有个工作场景: 1.公司的一台 CentOS 服 ...

  5. 线程.FTP.SFTP.打包

    Windows就是多线程模式.每一个解决方案就是一个进程.一个进程下拥有多个线程. 简单点.单核的处理器不存在多线程.是CPU在每一个线程上切换处理.在人反应不过来的情况下完成同步的效果. 比如左手画 ...

  6. Linux下几种文件传输命令 sz rz sftp scp

    Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具 ...

  7. linux 使用sftp命令

    1.使用SecureCRT软件进入sftp界面 2.常用的一些命令 服务器                 本地                   进入目录     cd lcd 查看目录结构    ...

  8. linux下如何使用sftp命令

    sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性.下边就简单介绍一下如何远程连接主机,进行文件的上传和下载,以及一些相关操作. 举例,如远程主机的 IP ...

  9. SFTP交互式文件传输

    sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性.下边就简单介绍一下如何远程连接主机,进行文件的上传和下载,以及一些相关操作. 举例,如远程主机的 IP ...

  10. 【SFTP】使用Jsch实现Sftp文件下载-支持断点续传和进程监控

    参考上篇文章: <[SFTP]使用Jsch实现Sftp文件下载-支持断点续传和进程监控>:http://www.cnblogs.com/ssslinppp/p/6248763.html  ...

随机推荐

  1. Centos7下完美安装并配置mysql5.6

    Centos7将默认数据库mysql替换成了Mariadb,对于我们这些还想用mysql的人来说并不是一个好消息. 最近我搜罗了网上各种安装教程,各种出问题,要么安装失败,要么安装成功了却使用不了my ...

  2. BZOJ1767/Gym207383I CEOI2009 Harbingers 斜率优化、可持久化单调栈、二分

    传送门--BZOJCH 传送门--VJ 注:本题在BZOJ上是权限题,在Gym里面也不能直接看,所以只能在VJ上交了-- 不难考虑到这是一个\(dp\). 设\(dep_x\)表示\(x\)在树上的带 ...

  3. Ionic项目的建立

    Ionic建立android项目的过程 1.cmd到目标盘文件,此处为D:\Dev\sourcecode\IonicApp\FlexApp\CaseStudy,执行ionic start CaseSt ...

  4. AT3611 Tree MST

    题面 题解 考虑最小化\(dis(x, y)\) 这里需要对一种奇怪的最小生成树算法:Boruvka算法有深刻的理解. 考虑该算法的执行过程,我们可以考虑进行点分治,每次找到离分治重心最近的点,然后将 ...

  5. 【译】高级指南-深入JSX

    title: 高级指南-深入JSX date: 2017-4-5 17:13:09 --- 深入JSX 从根本上来讲,JSX 仅仅是提供 React.createElement(component, ...

  6. 全自动数据表格JQuery版

    由于最近工作上有些变动,已经快一个月没有写博客了.上一篇博客[React]全自动数据表格组件——BodeGrid介绍了全自动数据表格的设计思路以及分享了一个react.js的实现.但是现实情况中为了节 ...

  7. 将 C# 枚举序列化为 JSON 字符串 基础理论

    该转换过程需要引用 Newtonsoft.JSON,这其中的转换过程还是蛮有意思的. 一.定义枚举 /// <summary> /// 托寄物品枚举 /// </summary> ...

  8. java使用何种类型表示精确的小数?

    问题 java使用何种类型表示精确的小数? 结论 float和double类型的主要设计目标是为了科学计算和工程计算,速度快,存在精度丢失 BigDecimal用来表示任意精确浮点数运算的类,在商业应 ...

  9. html绝对路径,相对路径

    .com/eat.php中引用.com/includes/headrt.php的话写includes/header.php .com/service/eat.php中引用.com/includes/h ...

  10. Oracle日常运维操作总结-数据库的启动和关闭

    下面是工作中对Oracle日常管理操作的一些总结,都是一些基本的oracle操作和SQL语句写法,在此梳理成手册,希望能帮助到初学者(如有梳理不准确之处,希望指出). 一.数据库的启动和关闭 1.1 ...