2011-08-09 9 views
18

Muszę przeczytać kilka plików .CSV z dynamicznymi nazwami plików z serwera SFTP. Te pliki są generowane co 15 minut.Korzystanie z JSch ChannelSftp: Jak odczytać wiele plików z nazwami dynamicznymi?

Używam JSch's ChannelSftp, ale nie ma metody, która dałaby dokładne nazwy plików. Widzę tylko metodę .ls(). Daje to wektor np.

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

Czy istnieje prosty sposób na odczytanie wszystkich plików w katalogu i skopiowanie ich w inne miejsce?

Ten kod działa dla kopiowania pojedynczego pliku:

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

Odpowiedz

44

Sposób ls jest jeden trzeba. Zwraca wektor obiektów LsEntry, z których każdy może zapytać o jego nazwę.

Tak, po swojej channelSftp.cd(SFTPWORKINGDIR);, można wykonać następujące czynności: (. Zakłada destinationPath to lokalna nazwa katalogu kończąc / (lub \ w Windows))

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

Oczywiście, jeśli nie chcesz ponownie pobierać tych samych plików po 15 minutach, możesz chcieć mieć listę lokalnych plików, porównać je (użyć HashSet lub podobnych) lub usunąć je z serwera.

+0

Dzięki Paŭlo Ebermann. To jest szybkie. Doceniam Twoją pomoc. – pingu

+2

Masz szczęście, że mam 'jsch' w [moje obserwowane tagi] (http://stackexchange.com/filters/19305/palos-filter) i gdzie właśnie sprawdzam kilka minut po wysłaniu :-). Miło, że mogłem pomóc. –

+0

czy ten kod nadal obowiązuje dla jsch 1.49? – ides

2

Należy zwrócić uwagę, że w przypadku parametru ls rozróżniana jest wielkość liter. Ta metoda pobiera wszystkie pliki CSV, niezależnie od rozszerzenia sprawy:

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()); 
    } 
} 
Powiązane problemy