使用jsch从SFTP下载文件

时间:2013-06-15 13:08:12

标签: java jsch

我正在使用JSCH从SFTP服务器下载文件。 我正在使用单个会话,有多个通道从SFTP中的不同文件夹下载文件。 对于这个下载过程,我有一组预定的工作。每份工作都会 1)每次打开一个新频道(ChannelSftp)。频道名称:sftp 2)使用命令 ls 来获取要下载的文件总数的大小 3)如果size(Vector)大于零,则使用 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 个答案:

答案 0 :(得分:0)

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

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");
}