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文件下载的更多相关文章

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

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

  2. FTP、SFTP文件下载内容校验

    描述: 从FTP.SFTP下载的文件做MD5码校验,文件名和MD5码值存放在表格里,表格位置在FTP.SFTP服务器上. os模块只能遍历本地目录/文件,需要先连接FTP.SFTP服务器,将表格下载到 ...

  3. [dotnet] 封装一个同时支持密码/安全密钥认证的SFTP下载器,简单易用。

    前言 最近在开发订单对账系统,先从各种支付平台获取订单销售数据,然后与公司商城订单数据进行对账兜底.总体上,各个支付平台提供数据的方式分为两类,一般以接口的方式提供实时数据,比如:webservice ...

  4. GO实现简单(命令行)工具:sftp,文檔压解,RDS备份,RDS备份下载

    GO实现简单(命令行)工具:sftp,文檔压解,RDS备份,RDS备份下载 轉載請註明出處:https://www.cnblogs.com/funnyzpc/p/11721978.html 内容提要: ...

  5. 常用DOS命令和Linux命令

    DOS命令 1.查询端口占用情况:netstat -aon |findstr "8080"; 查看端口进程号: 2.查看进程号信息:   tasklist |findstr &qu ...

  6. 【转】JSch - Java实现的SFTP(文件下载详解篇)

    上一篇讲述了使用JSch实现文件上传的功能,这一篇主要讲述一下JSch实现文件下载的功能.并介绍一些SFTP的辅助方法,如cd,ls等.   同样,JSch的文件下载也支持三种传输模式:OVERWRI ...

  7. JSch - Java实现的SFTP(文件下载详解篇)

    上一篇讲述了使用JSch实现文件上传的功能,这一篇主要讲述一下JSch实现文件下载的功能.并介绍一些SFTP的辅助方法,如cd,ls等. 同样,JSch的文件下载也支持三种传输模式:OVERWRITE ...

  8. JSch - Java实现的SFTP(文件下载详解篇)(转)

    上一篇讲述了使用JSch实现文件上传的功能,这一篇主要讲述一下JSch实现文件下载的功能.并介绍一些SFTP的辅助方法,如cd,ls等.   同样,JSch的文件下载也支持三种传输模式:OVERWRI ...

  9. sftp,ftp文件下载

    一.sftp工具类 package com.ztesoft.iotcmp.util; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsc ...

随机推荐

  1. linux 将终端进行换行

    原始 修改 修改方法 vim .bashrc fi if [ "$color_prompt" = yes ]; then PS1='${debian_chroot:+($debia ...

  2. tpshop商品属性表关系

    TPshop 里面的商品属性, 首先看看TPshop商品详情中的属性介绍, 纯展示给用户看的. 再来tpshop看看商品列表帅选页面的属性,可以根据属性帅选不同的商品 再来看看tpshop后台属性管理 ...

  3. unity---------------------关于BuildAssetBundles的使用(打包)

    using UnityEditor;using UnityEngine; public class BuildAssetBundle{ /// <summary> /// 点击后,所有设置 ...

  4. MySQL查看某库表大小及锁表情况

    查询所有数据库占用磁盘空间大小的SQL语句: 语句如下: select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2),' MB ...

  5. Linux语言设置修改乱码

    1.system-config-language 命令语言改成英文.(安装yum install  system-config-language) 如何系统安装后,使用的语言不是自己想要的.但是在图形 ...

  6. JSON数组,JSON对象,数组的区别与基本操作整理

    JSON 语法规则 JSON 语法是 javascript 对象表示语法的子集. 数据在名称/值对中 数据由逗号分隔 花括号保存对象 方括号保存数组 JSON 名称/值对 JSON 数据的书写格式是: ...

  7. 查看WEB服务器的连接数

    查看WEB服务器的连接数 https://technet.microsoft.com/en-us/sysinternals/bb897437 tcpView

  8. SharePoint PowerShell使用Backup-SPSite指令来备份网站集

    备份网站集: Backup-SPSite -Identity http://win2012sp2013:1000/ -Path "C:\KenmuTemp\Test File\Temp\si ...

  9. CSS 文本缩进,行间距

    文本缩进:text-indent:2.0em; 行间距:line-height:1.5em;

  10. innodb分区

    当 MySQL的总记录数超过了100万后,性能会大幅下降,可以采用分区方案 分区允许根据指定的规则,跨文件系统分配单个表的多个部分.表的不同部分在不同的位置被存储为单独的表. 1.先看下innodb的 ...