2011-08-09 36 views
18

Tengo que leer un montón de archivos .CSV con nombres de archivos dinámicos de un servidor SFTP. Estos archivos se generan cada 15 minutos.Usando JSch ChannelSftp: ¿Cómo leer múltiples archivos con nombres dinámicos?

Estoy usando ChannelSftp de JSch, pero no hay ningún método que proporcione los nombres exactos de los archivos. Solo veo un método .ls(). Esto da un Vector, p.

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

¿Hay una manera simple de leer todos los archivos en un directorio y copiarlos en otra ubicación?

Este código funciona para copiar un solo archivo:

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"); 

Respuesta

44

El método ls es el que necesita. Devuelve un vector de objetos LsEntry, cada uno de los cuales puede preguntar sobre su nombre.

Así que, después de su channelSftp.cd(SFTPWORKINGDIR);, se puede hacer lo siguiente: (. Esto supone destinationPath es un nombre de directorio local que termina con / (o \ en Windows))

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

Por supuesto, si no desea volver a descargar los mismos archivos después de 15 minutos, le conviene tener una lista de los archivos locales, compararlos (usar un HashSet o similar) o eliminarlos del servidor.

+0

Gracias Paŭlo Ebermann. Eso es rápido Aprecio tu ayuda. – pingu

+2

Tuviste suerte de tener 'jsch' en [mis etiquetas observadas] (http://stackexchange.com/filters/19305/palos-filter), y donde solo revisé algunos minutos después de haber publicado :-). Encantado de ayudar. –

+0

¿este código sigue siendo aplicable para jsch 1.49? – ides

2

Tenga en cuenta que ls distingue entre mayúsculas y minúsculas. Este método recupera todos los archivos csv, independientemente de la extensión

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()); 
    } 
} 
Cuestiones relacionadas