使用JSCH从FTP服务器下载多个文件

时间:2012-11-08 16:11:51

标签: sftp jsch

我想使用JSCH从FTP服务器下载所有文件。

以下是代码段

        List<File> fileList = null;
        Vector<ChannelSftp.LsEntry> list = sftpChannel.ls(remoteFolder);
        for (ChannelSftp.LsEntry file : list) {

            if( getLog().isDebugEnabled() ){
                getLog().debug("Retrieved Files  from the folder  is"+file);
            }

            if (!(new File(file.getFilename())).isFile()) {
                continue;
            }
       fileList.add(new File(remoteFolder,file.getFilename())) ;
       return fileList; 

该方法将返回List,以便使用sftpChannel.get(src,dest)从远程服务器下载文件的另一种方法;

如果代码合适,请告诉我。 我没有测试环境,所以无法确认。 但是我为FTPClient编写的代码有些类似,但它确实有用。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用SftpATTRS获取文件信息。您可以声明一个包装类来存储文件信息。示例如下所示。

    private class SFTPFile
{
    private SftpATTRS sftpAttributes;

    public SFTPFile(LsEntry lsEntry)
    {
        this.sftpAttributes = lsEntry.getAttrs();
    }

    public boolean isFile()
    {
        return (!sftpAttributes.isDir() && !sftpAttributes.isLink());
    }
}

现在您可以使用此类来测试LsEntry是否为文件

    private List<SFTPFile> getFiles(String path)
{
    List<SFTPFile> files = null;
    try
    {
        List<?> lsEntries = sftpChannel.ls(path);
        if (lsEntries != null)
        {
            files = new ArrayList<SFTPFile>();
            for (int i = 0; i < lsEntries.size(); i++)
            {
                Object next = lsEntries.get(i);
                if (!(next instanceof LsEntry))
                {
                    // throw exception
                }
                SFTPFile sftpFile = new SFTPFile((LsEntry) next);
                if (sftpFile.isFile())
                {
                    files.add(sftpFile);
                }
            }
        }
    }
    catch (SftpException sftpException)
    {
        //
    }
    return files;
}

现在你可以使用sftpChannel.get(src,dest);下载文件。