Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用jsch从SFTP下载文件_Java_Jsch - Fatal编程技术网

Java 使用jsch从SFTP下载文件

Java 使用jsch从SFTP下载文件,java,jsch,Java,Jsch,我正在使用JSCH从SFTP服务器下载文件。 我使用单个会话,通过多个通道从位于SFTP中的不同文件夹下载文件。 对于这个下载过程,我有一组预定的作业。每项工作将: 每次打开一个新频道(ChannelSftp)。频道名称:sftp 使用方法ChannelSftp.ls()获取要下载的文件总数的大小 如果大小(Vector)大于零,则使用ChannelSftp.get(remotedir/'*.*',localdir)下载所有文件 最后关闭打开的通道 在上述过程中,大多数时候我都没有找到文件,或者

我正在使用JSCH从SFTP服务器下载文件。 我使用单个会话,通过多个通道从位于SFTP中的不同文件夹下载文件。 对于这个下载过程,我有一组预定的作业。每项工作将:

  • 每次打开一个新频道(
    ChannelSftp
    )。频道名称:sftp
  • 使用方法
    ChannelSftp.ls()
    获取要下载的文件总数的大小
  • 如果大小(Vector)大于零,则使用
    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