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");
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.
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()); } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With