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");
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.
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());
}
}