23

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

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

[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");
4

2 回答 2

53

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 或类似的),或者从服务器中删除它们。

于 2011-08-09T23:05:29.937 回答
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());
    }
}
于 2014-04-28T20:44:54.813 回答