Использование 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");
Ответы
Ответ 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());
}
}