使用JSch ChannelSftp:如何使用动态名称读取多个文件?

时间:2011-08-09 22:35:57

标签: sftp jsch

我必须从SFTP服务器读取一堆带有动态文件名的.CSV文件。这些文件每15分钟生成一次。

我正在使用JSch的ChannelSftp,但是没有方法可以提供确切的文件名。我只看到.ls()方法。这给出了一个Vector,例如

[drwxr-xr-x    2 2019     2019          144 Aug  9 22:29 .,
 drwx------    6 2019     2019          176 Aug 27  2009 ..,
 -rw-r--r--    1 2019     2019          121 Aug  9 21:03 data_task1_2011_TEST.csv,
 -rw-r--r--    1 2019     2019          121 Aug  9 20:57 data_task1_20110809210007.csv]

是否有一种简单的方法可以读取目录中的所有文件并将它们复制到另一个位置?

此代码适用于复制单个文件:

JSch jsch = new JSch();
session = jsch.getSession(SFTPUSER,SFTPHOST,SFTPPORT);
session.setPassword(SFTPPASS);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
channel = session.openChannel("sftp");
channel.connect();
channelSftp = (ChannelSftp)channel;
channelSftp.cd(SFTPWORKINGDIR);
channelSftp.get("data_task1_20110809210007.csv","data_task1_20110809210007.csv");

2 个答案:

答案 0 :(得分:50)

ls方法是您需要的方法。它返回LsEntry个对象的向量,每个对象都可以询问它的名称。

因此,在channelSftp.cd(SFTPWORKINGDIR);之后,您可以执行以下操作:

Vector<ChannelSftp.LsEntry> list = channelSftp.ls("*.cvs");
for(ChannelSftp.LsEntry entry : list) {
    channelSftp.get(entry.getFilename(), destinationPath + entry.getFilename());
}

(这假定destinationPath是以/结尾的本地目录名(或Windows中的\)。)

当然,如果你不想在15分钟后再次下载相同的文件,你可能想要一个本地文件列表,比较它们(使用HashSet或类似文件),或从中删除它们服务器

答案 1 :(得分:2)

请注意,ls区分大小写。无论扩展情况如何,此方法都会检索所有csv文件

ArrayList<String> list = new ArrayList<String>();
Vector<LsEntry> entries = sftpChannel.ls("*.*");
for (LsEntry entry : entries) {
    if(entry.getFilename().toLowerCase().endsWith(".csv")) {
        list.add(entry.getFilename());
    }
}