当前位置: 首页 > 知识库问答 >
问题:

使用jsch从SFTP下载文件

花高爽
2023-03-14

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

  1. 每次打开一个新通道(channelsftp)。通道名称:SFTP
  2. 使用方法channelsftp.ls()获取要下载的文件总数的大小
  3. 如果size(Vector)大于零,则使用channelsftp.get(remotedir/'*.*',localdir)下载所有文件
  4. 最后关闭打开的通道。

在上面的过程中,大多数时候我得到的文件,找不到或没有这样的文件异常,并没有下载一些文件。

谁能告诉我为什么会这样。可能是什么原因。如何解决这个问题

下面是我正在使用的代码:

ChannelSftp channelSftp = null;

try {
    channelSftp = getChannelConnectionUtil().openChannel(); //SFTPConnection.getSession().openChannel("sftp");  

    @SuppressWarnings("rawtypes")
    Vector numOfFiles = channelSftp.ls(ftpDir+"/*.*");

    if(numOfFiles.size() > 0){
        channelSftp.get(ftpDir+"/*.*",localDir); // Here I am getting error
    }
}  catch (Exception e) {
    e.printStackTrace();
} finally {
    getChannelConnectionUtil().disconnectChannel(channelSftp);
}

共有1个答案

应和光
2023-03-14

没有您的代码,很难诊断问题。我建议忘记向量大小检查,简单地遍历你的向量列表并计算抓取的文件数量。下面是我用来检查和从远程主机下载文件的代码块:

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");
}
 类似资料:
  • 我正在尝试使用JSch从SFTP服务器下载文件到我的本地机器。无论文件大小如何,它只下载16371字节的数据并结束传输。它不会引发任何异常。如果文件小于16371字节,它将成功传输,但对于任何较大的文件,传输都会导致文件损坏。

  • 问题内容: 我正在使用jsch从服务器下载文件,下面是我的代码。 com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2629) at com.jcraft.jsch.ChannelSftp._get(ChannelSftp.java:977) at com.jcraft.jsch.ChannelSftp.get(Channe

  • 在apache commons net ftpclient中,有ftpclient.printWorkingDirectory()来获取当前目录的字符串。 如何使用jsch sftp客户机实现同样的功能?有一个名为realpath(String)的方法,但它似乎不对,我无法使其工作。

  • 我试图开发一个程序,这是检索一组文件从一个SFTP服务器到另一个本地目录。 下载完成后,我们用他的真实文件名重命名文件(服务器SFTP的文件名)

  • 这是我必须做的:外部服务器定期生成3个文件:“FI.date.nnnnn”、“FS.date.nnnnn”和GO.date.nnnnn”。这三个文件与相同的日期和nnnnn(=序列号)相关联。每个“三元组”都是唯一的名称。当GO文件存在时,我必须下载这些文件。这个GO文件是空的。 我用骆驼这个路线: 我使用“include=GO.*”来等待GO文件。 在我的AfterReceiveGo中,我使用了

  • 我的本地计算机上有一个文件。我有一个Perl脚本可以通过SFTP连接将此文件复制到远程位置()。