Java 使用jsch从SFTP下载文件
我正在使用JSCH从SFTP服务器下载文件。 我使用单个会话,通过多个通道从位于SFTP中的不同文件夹下载文件。 对于这个下载过程,我有一组预定的作业。每项工作将:Java 使用jsch从SFTP下载文件,java,jsch,Java,Jsch,我正在使用JSCH从SFTP服务器下载文件。 我使用单个会话,通过多个通道从位于SFTP中的不同文件夹下载文件。 对于这个下载过程,我有一组预定的作业。每项工作将: 每次打开一个新频道(ChannelSftp)。频道名称:sftp 使用方法ChannelSftp.ls()获取要下载的文件总数的大小 如果大小(Vector)大于零,则使用ChannelSftp.get(remotedir/'*.*',localdir)下载所有文件 最后关闭打开的通道 在上述过程中,大多数时候我都没有找到文件,或者
ChannelSftp
)。频道名称:sftpChannelSftp.ls()
获取要下载的文件总数的大小ChannelSftp.get(remotedir/'*.*',localdir)
下载所有文件ChannelSftp ChannelSftp=null;
试一试{
channelSftp=getChannelConnectionUtil().openChannel();//SFTPConnection.getSession().openChannel(“sftp”);
@抑制警告(“原始类型”)
向量numofiles=channelSftp.ls(ftpDir+“/*”);
如果(numofiles.size()>0){
channelSftp.get(ftpDir+“/*.*”,localDir);//这里我得到了一个错误
}
}捕获(例外e){
e、 printStackTrace();
}最后{
getChannelConnectionUtil().disconnectChannel(channelSftp);
}
没有您的代码,很难诊断问题。我建议忘记向量大小检查,只需遍历向量列表并计算捕获的文件数。下面是我用来检查和下载远程主机文件的代码块:
try {
ChannelSftp c = (ChannelSftp) channel;
c.lcd(localDir);
logger.info("lcd " + c.lpwd());
// Get a listing of the remote directory
@SuppressWarnings("unchecked")
Vector<ChannelSftp.LsEntry> list = c.ls(".");
logger.info("ls .");
// iterate through objects in list, identifying specific file names
for (ChannelSftp.LsEntry oListItem : list) {
// output each item from directory listing for logs
logger.info(oListItem.toString());
// If it is a file (not a directory)
if (!oListItem.getAttrs().isDir()) {
// Grab the remote file ([remote filename], [local path/filename to write file to])
logger.info("get " + oListItem.getFilename());
c.get(oListItem.getFilename(), oListItem.getFilename()); // while testing, disable this or all of your test files will be grabbed
grabCount++;
// Delete remote file
//c.rm(oListItem.getFilename()); // Deleting remote files is not requried in every situation.
}
}
// Report files grabbed to log
if (grabCount == 0) {
logger.info("Found no new files to grab.");
} else {
logger.info("Retrieved " + grabCount + " new files.");
}
} catch(SftpException e) {
logger.warning(e.toString());
} finally {
// disconnect session. If this is not done, the job will hang and leave log files locked
session.disconnect();
logger.info("Session Closed");
}
试试{
ChannelSftp c=(ChannelSftp)信道;
c、 液晶显示器(localDir);
logger.info(“lcd”+c.lpwd());
//获取远程目录的列表
@抑制警告(“未选中”)
向量列表=c.ls(“.”);
logger.info(“ls”);
//遍历列表中的对象,标识特定的文件名
对于(ChannelSftp.LsEntry oListItem:列表){
//输出日志目录列表中的每个项目
logger.info(oListItem.toString());
//如果是文件(不是目录)
如果(!oListItem.getAttrs().isDir()){
//获取远程文件([远程文件名],[要将文件写入的本地路径/文件名])
info(“get”+oListItem.getFilename());
c、 get(oListItem.getFilename(),oListItem.getFilename());//测试时,禁用此选项,否则将捕获所有测试文件
grabCount++;
//删除远程文件
//c、 rm(oListItem.getFilename());//并非所有情况下都需要删除远程文件。
}
}
//要记录的报告文件
如果(grabCount==0){
info(“未找到要获取的新文件”);
}否则{
info(“已检索”+grabCount+“新文件”);
}
}捕获(SFTPE例外){
logger.warning(例如toString());
}最后{
//断开会话连接。如果未完成此操作,作业将挂起并保持日志文件锁定
session.disconnect();
logger.info(“会话关闭”);
}
请发布给您带来问题的代码。在这里您得到了什么错误?它在哪里说ChannelSftp.get()
允许使用通配符?嗨,达米恩,在我的SFTP中,当我触摸文件时,它将被移动到另一个文件夹。触摸表示来自程序或类似工具(WinScp)。在上面的代码中,同时使用get命令。如果我做错了什么,请提出建议。ls不应导致文件被触摸。这可能是jsch中mget的一个怪癖。与使用通配符执行mget不同,请尝试创建一个列表并像我在示例中所做的那样对其进行迭代。对于我的解决方案,我正在对一家银行进行FTP,该银行具有与您描述的相同的功能。。。触摸的文件会自动存档。我的脚本在从他们的服务器抓取时运行良好。嗨,达米恩,谢谢你的回复。我将尝试使用您的代码,您能告诉我一次获取所有文件(按照我的代码)和获取单个文件(按照您的代码)之间的区别吗?我还必须从SFTP服务器而不是FTP获取文件。嗨,Damien,在上面的代码中,你没有设置当前目录。我的意思是你只设置了lcd,没有设置cd。我必须把它弄对吗?是的。对于我的脚本,SFTP主机为我们提供了一个特殊的登录名,其默认目录是文件所在的位置,因此不需要更改目录。更改远程目录就像更改本地目录一样,只需使用c.cd而不是c.lcd