SFTP文件下载
FTP并不是唯一的上传文件的方法,大部分情况下都可使用sftp代替。sftp是什么呢?
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的一部分,SFTP是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低一些。
sftp是不需要另外安装的,因为是SSH自带的,所以会更省系统资源,也不需要单独配置,对新手来说比较简单。
Windows下面常见的FTP客户端Filezilla、Flashfxp、Winscp、cuteftp等都是支持sftp的,只需要在登陆时选择sftp协议,输入SSH的账号密码。
下面是使用.NET程序登陆SFTP下载文件的方法
SFTPHELPER文件提供方法:
using Tamir.SharpSsh;
using Tamir.SharpSsh.jsch;
//----------------需要包含的命名空间
public class SFTPHelper
{
private Session m_session;
private Channel m_channel;
private ChannelSftp m_sftp; log4net.ILog log = log4net.LogManager.GetLogger("SFTPDownload"); //host:sftp地址 user:用户名 pwd:密码
public SFTPHelper(string host, string user, string pwd)
{
string[] arr = host.Split(':');
string ip = arr[];
int port = ;
if (arr.Length > ) port = Int32.Parse(arr[]); JSch jsch = new JSch();
m_session = jsch.getSession(user, ip, port);
//log.Info("m_session:"+m_session.ToString()+" - "+m_session.isConnected());
MyUserInfo ui = new MyUserInfo();
ui.setPassword(pwd);
m_session.setUserInfo(ui);
} //SFTP连接状态
public bool Connected { get { return m_session.isConnected(); } } //连接SFTP
public bool Connect()
{
try
{
if (!Connected)
{
//log.Info("start connect 1");
//m_session.setClientVersion("SSH-2.0-SharpSSH-1.1.1.13-JSCH-0.1.28"); m_session.connect();
//log.Info("start connnect 2");
m_channel = m_session.openChannel("sftp");
m_channel.connect();
//log.Info("channel connect");
m_sftp = (ChannelSftp)m_channel;
//log.Info(m_session.getServerVersion()+" - "+m_session.getClientVersion());
}
return true;
}
catch(Exception exp)
{
log.Info("登陆失败原因:"+exp.ToString());
return false;
}
} //断开SFTP
public void Disconnect()
{
if (Connected)
{
m_channel.disconnect();
m_session.disconnect();
}
} //SFTP存放文件
public bool Put(string localPath, string remotePath)
{
try
{
Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(localPath);
Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(remotePath);
m_sftp.put(src, dst);
return true;
}
catch
{
return false;
}
} //SFTP获取文件
public bool Get(string remotePath, string localPath)
{
try
{
Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(remotePath);
Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(localPath);
m_sftp.get(src, dst);
return true;
}
catch(Exception exp)
{
log.Info("文件下载失败原因:" + exp.ToString());
return false;
}
}
//删除SFTP文件
public bool Delete(string remoteFile)
{
try
{
m_sftp.rm(remoteFile);
return true;
}
catch (Exception exp)
{
log.Info("文件删除失败原因:" + exp.ToString());
return false;
}
} //获取SFTP文件列表
public ArrayList GetFileList(string remotePath, string fileType)
{
try
{
Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(remotePath);
ArrayList objList = new ArrayList();
foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry qqq in vvv)
{
string sss = qqq.getFilename();
if (sss.Length > (fileType.Length + ) && fileType == sss.Substring(sss.Length - fileType.Length) && sss != "." && sss!= "..")
{ objList.Add(sss); }
else { continue; }
} return objList;
}
catch (Exception exp)
{
log.Info("文件列表获取失败原因:" + exp.ToString());
return null;
}
} //登录验证信息
public class MyUserInfo : UserInfo
{
String passwd;
public String getPassword() { return passwd; }
public void setPassword(String passwd) { this.passwd = passwd; } public String getPassphrase() { return null; }
public bool promptPassphrase(String message) { return true; } public bool promptPassword(String message) { return true; }
public bool promptYesNo(String message) { return true; }
public void showMessage(String message) { }
} }
调用上面的文件:
public void DownFtpFiles()
{
//log4net.Config.XmlConfigurator.Configure(); while (true)
{
SFTPHelper sftphelper = new SFTPHelper(ftpIP, ftpUserName, ftpPassword);
try{
System.Threading.Thread.Sleep();
log.Info("开始登陆FTP服务器");
//LogHelper.WriteLog("开始登陆FTP服务器");
bool bconn = sftphelper.Connect();
if (bconn)
{
log.Info("登陆成功");
ArrayList objList = new ArrayList();
objList = sftphelper.GetFileList(ftpRoot, "dat");
log.Info("文件列表获取成功"); string fileName = null;
foreach (object obj in objList)
{
string fileUrl = obj.ToString();
fileName = fileUrl;
try
{ log.Info("开始下载," + fileUrl);
sftphelper.Get(ftpRoot + "/" + fileUrl, tempFileDir + "\\" + fileName);
File.Move(tempFileDir + "\\" + fileName, downloadFileDir + "\\" + fileName); //记录到已下载的列表中
//this.AppendDownloaded(fileUrl);
//删除远程文件
sftphelper.Delete(ftpRoot + "/" + fileUrl); log.Info("下载成功," + ftpRoot + "/" + fileUrl); }
catch (Exception exp)
{
log.Info("下载或移动失败," + fileUrl + ",原因是:" + exp.ToString());
}
} }
else
{
log.Info("登陆失败");
}
}
catch (Exception exp)
{
log.Info("下载或移动失败,原因是:" + exp.ToString());
}
finally
{
try
{
sftphelper.Disconnect();
}
catch (Exception ex)
{
log.Info("关闭FTP连接异常,原因是:" + ex.ToString());
}
}
}
}
SFTP文件下载的更多相关文章
- 【SFTP】使用Jsch实现Sftp文件下载-支持断点续传和进程监控
参考上篇文章: <[SFTP]使用Jsch实现Sftp文件下载-支持断点续传和进程监控>:http://www.cnblogs.com/ssslinppp/p/6248763.html ...
- FTP、SFTP文件下载内容校验
描述: 从FTP.SFTP下载的文件做MD5码校验,文件名和MD5码值存放在表格里,表格位置在FTP.SFTP服务器上. os模块只能遍历本地目录/文件,需要先连接FTP.SFTP服务器,将表格下载到 ...
- [dotnet] 封装一个同时支持密码/安全密钥认证的SFTP下载器,简单易用。
前言 最近在开发订单对账系统,先从各种支付平台获取订单销售数据,然后与公司商城订单数据进行对账兜底.总体上,各个支付平台提供数据的方式分为两类,一般以接口的方式提供实时数据,比如:webservice ...
- GO实现简单(命令行)工具:sftp,文檔压解,RDS备份,RDS备份下载
GO实现简单(命令行)工具:sftp,文檔压解,RDS备份,RDS备份下载 轉載請註明出處:https://www.cnblogs.com/funnyzpc/p/11721978.html 内容提要: ...
- 常用DOS命令和Linux命令
DOS命令 1.查询端口占用情况:netstat -aon |findstr "8080"; 查看端口进程号: 2.查看进程号信息: tasklist |findstr &qu ...
- 【转】JSch - Java实现的SFTP(文件下载详解篇)
上一篇讲述了使用JSch实现文件上传的功能,这一篇主要讲述一下JSch实现文件下载的功能.并介绍一些SFTP的辅助方法,如cd,ls等. 同样,JSch的文件下载也支持三种传输模式:OVERWRI ...
- JSch - Java实现的SFTP(文件下载详解篇)
上一篇讲述了使用JSch实现文件上传的功能,这一篇主要讲述一下JSch实现文件下载的功能.并介绍一些SFTP的辅助方法,如cd,ls等. 同样,JSch的文件下载也支持三种传输模式:OVERWRITE ...
- JSch - Java实现的SFTP(文件下载详解篇)(转)
上一篇讲述了使用JSch实现文件上传的功能,这一篇主要讲述一下JSch实现文件下载的功能.并介绍一些SFTP的辅助方法,如cd,ls等. 同样,JSch的文件下载也支持三种传输模式:OVERWRI ...
- sftp,ftp文件下载
一.sftp工具类 package com.ztesoft.iotcmp.util; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsc ...
随机推荐
- Java注释规范整理
Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00018736 在软件开发的过程中总是强调注释的规范,但 ...
- 【WPF】WPF DataGrid List数据源 双向绑定通知机制之ObservableCollection使用以及MultiBinding 的应用
以下代码实现了DataGrid的简单绑定List数据源 重点要提一下的是,绑定List数据源,但是不能直接用List.比如下面的代码,使用List<GridItem>只能实现数据修改的绑定 ...
- EF5+MVC4系列(6) 简单三层的搭配(泛型) 实现 增删改查
1:项目结构 2:每层添加对其他层的引用,这里我们把除了Web层之外的所有的层生成的文件都放到解决方案下的Library文件夹下,然后每个项目分别来引用里面的dll项目文件. 我们在Model项目上, ...
- PD 15.1 安装 破解 , 简单使用 (一对多,多对多关系生成sql脚本) , CDM 和 PDM 的区别;PD15.1 生成sql2008 无FK外键约束的解决方法
CDM是概念模型,在概念模型上没有具体数据库产品的概念,反映的是实体和联系.PDM是物理模型,是依赖具体数据库产品的模型,比如可以指定具体的数据类型和约束等等.在PowerDesigner中两个模型之 ...
- C# 分享几个ip的方法吧,包括正则验证ip
/// <summary> /// 正规则试验IP地址 /// </summary> /// <param name="IP"></par ...
- 9款赏心悦目的HTML5/CSS3应用特效
经过几天的收集,在html5tricks网站上又增加了不少HTML5的教程和应用,今天我把几款赏心悦目的HTML5/CSS3应用特效总结了一下,一共9款HTML5特效,分享给大家. 1.HTML5 W ...
- Hotspot JVM的常用选项
Hotspot JVM的常用选项 选项的分类 Hotspot JVM提供以下三大类选项: 1. 标准选项:这类选项的功能是很稳定的,在后续版本中也不太会发生变化.运行java或者java -help可 ...
- cordova开发跨平台应用问题随笔记
iOS下频繁请求地理位置授权 做的某个cordova应用有用到geolocation插件,跑在iOS的时候发现app请求了一次授权,结果webkit还请求了一次授权,不但如此,webkit请求的格式还 ...
- [转]POI实现读写Excel2007完整示例
http://blog.csdn.net/little_stars/article/details/8210532 流程:(跟jxl相似,只是读取逻辑有点不同) 跟jxl的两处主要区别: 1.读取和写 ...
- Lua基础语法讲解
Lua 是什么? Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. Lua 是巴西里约热内卢天主教大学( ...