SFTPサーバーから動的なファイル名を持つ.CSVファイルをたくさん読む必要があります。これらのファイルは15分ごとに生成されます。
私はJSchのChannelSftpを使用していますが、正確なファイル名を提供する方法はありません。 .ls()
メソッドのみが表示されます。これにより、ベクターが得られます。
[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]
ディレクトリ内のすべてのファイルを読み取り、それらを別の場所にコピーする簡単な方法はありますか?
このコードは、単一のファイルをコピーするために機能します。
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");
ls
メソッドが必要です。 LsEntry オブジェクトのベクトルを返します。各オブジェクトの名前を尋ねることができます。
したがって、channelSftp.cd(SFTPWORKINGDIR);
の後、次のことができます。
Vector<ChannelSftp.LsEntry> list = channelSftp.ls("*.cvs");
for(ChannelSftp.LsEntry entry : list) {
channelSftp.get(entry.getFilename(), destinationPath + entry.getFilename());
}
(これは、destinationPath
が/
(またはWindowsでは\
)で終わるローカルディレクトリ名であることを前提としています。)
もちろん、15分後に同じファイルを再度ダウンロードしたくない場合は、ローカルファイルのリストを作成して、それらを比較(HashSetなどを使用)するか、サーバーから削除します。
ls
では大文字と小文字が区別されることに注意してください。このメソッドは、拡張子の大小に関係なく、すべてのcsvファイルを取得します
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());
}
}