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