web-dev-qa-db-fra.com

Utilisation de JSch ChannelSftp: Comment lire plusieurs fichiers avec des noms dynamiques?

Je dois lire un tas de fichiers .CSV avec des noms de fichiers dynamiques à partir 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 aucune méthode qui donnerait les noms de fichiers exacts. Je ne vois qu'une méthode .ls(). Cela donne un vecteur, par ex.

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

Existe-t-il un moyen simple de lire tous les fichiers d'un répertoire et de les copier vers un autre emplacement?

Ce code fonctionne pour copier un seul 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");
21
pingu

La méthode ls est celle dont vous avez besoin. Il retourne un vecteur d'objets LsEntry , chacun desquels vous pouvez demander son nom.

Ainsi, après votre channelSftp.cd(SFTPWORKINGDIR);, vous pouvez effectuer les opérations suivantes:

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

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

Bien sûr, si vous ne souhaitez pas télécharger à nouveau les mêmes fichiers après 15 minutes, vous souhaiterez peut-être avoir une liste des fichiers locaux, les comparer (utiliser un HashSet ou similaire) ou les supprimer du serveur.

50
Paŭlo Ebermann

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
berbt