Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using JSch ChannelSftp: How to read multiple files with dynamic names?

Tags:

I have to read a bunch of .CSV files with dynamic file names from a SFTP server. These files get generated every 15 minutes.

I am using JSch's ChannelSftp, but there is no method which would give the exact filenames. I only see an .ls() method. This gives a Vector e.g.

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

Is there a simple way to read all the files in a directory and copy them to another location?

This code works for copying a single file:

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"); 
like image 713
pingu Avatar asked Aug 09 '11 22:08

pingu


2 Answers

The ls method is the one you need. It returns a vector of LsEntry objects, each of which you can ask about its name.

So, after your channelSftp.cd(SFTPWORKINGDIR);, you could do the following:

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

(This assumes destinationPath is a local directory name ending with / (or \ in Windows).)

Of course, if you don't want to download the same files again after 15 minutes, you might want to have a list of the local files, to compare them (use a HashSet or similar), or delete them from the server.

like image 200
Paŭlo Ebermann Avatar answered Sep 21 '22 21:09

Paŭlo Ebermann


Note that ls is case sensitive. This method retrieves all csv files, regardless of the extension case

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());     } } 
like image 20
berbt Avatar answered Sep 20 '22 21:09

berbt