web-dev-qa-db-ja.com

JSch ChannelSftpの使用:動的な名前を持つ複数のファイルを読み取る方法

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

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などを使用)するか、サーバーから削除します。

50
Paŭlo Ebermann

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());
    }
}
2
berbt