Utiliser Jsch ChannelSftp: comment lire plusieurs fichiers avec des noms dynamiques?

je dois lire un tas de .Fichiers CSV avec des noms de fichiers dynamiques d'un serveur SFTP. Ces fichiers sont générés toutes les 15 minutes.

j'utilise ChannelSftp de JSch, mais il n'y a pas de méthode qui donnerait les noms exacts des fichiers. Je ne vois qu'un .ls() méthode. Cela donne un Vecteur par exemple

[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]

Est-il un moyen simple de lire tous les fichiers dans un répertoire et de les copier vers un autre emplacement?

ce code fonctionne pour copier un fichier:

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");
19
demandé sur Paŭlo Ebermann 2011-08-10 02:35:57

2 réponses

ls méthode est celle dont vous avez besoin. Elle retourne un vecteur de Isentry objets, chacun desquels vous pouvez demander son nom.

Donc, après votre channelSftp.cd(SFTPWORKINGDIR);, vous pouvez faire ce qui suit:

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

(cela suppose destinationPath est un nom de répertoire se terminant par / (ou \ sous Windows).)

bien sûr, si vous ne voulez pas télécharger les mêmes fichiers à nouveau après 15 minutes, vous pouvez avoir une liste des fichiers locaux, pour les comparer (utilisez un HashSet ou similaire), ou les supprimer du serveur.

47
répondu Paŭlo Ebermann 2017-04-05 12:09:27

Notez que ls est sensible à la casse. Cette méthode récupère tous les fichiers csv, quel que soit le cas d'extension

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());
    }
}
2
répondu berbt 2014-05-25 17:59:05