23

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

2 に答える 2

53

ls方法はあなたが必要とするものです。LsEntryオブジェクトのベクトルを返します。各オブジェクトの名前を尋ねることができます。

だから、あなたの後にchannelSftp.cd(SFTPWORKINGDIR);、あなたは次のことをすることができます:

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

(これは、 (またはWindowsでは)でdestinationPath終わるローカルディレクトリ名であると想定しています。)/\

もちろん、15分後に同じファイルを再度ダウンロードしたくない場合は、ローカルファイルのリストを作成して比較するか(HashSetなどを使用)、サーバーから削除することをお勧めします。

于 2011-08-09T23:05:29.937 に答える
2

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());
    }
}
于 2014-04-28T20:44:54.813 に答える