Подтвердить что ты не робот

Использование JSch ChannelSftp: как читать несколько файлов с динамическими именами?

Мне нужно прочитать кучу файлов .CSV с динамическими именами файлов с сервера SFTP. Эти файлы генерируются каждые 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");
4b9b3361

Ответ 1

Метод 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 или аналогичные) или удалить их из сервер.

Ответ 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());
    }
}