1

JSCH を使用して SFTP サーバーからファイルをダウンロードしています。SFTPにあるさまざまなフォルダーからファイルをダウンロードするために複数のチャネルを使用して、単一のセッションを使用しています。このダウンロード プロセスのために、一連のスケジュールされたジョブがあります。各ジョブは次のようになります。

  1. ChannelSftp毎回新しいチャンネル ( ) を開きます。チャンネル名:sftp
  2. メソッドChannelSftp.ls()を使用して、ダウンロードするファイルの総数のサイズを取得します
  3. size(Vector) がゼロより大きい場合、ChannelSftp.get(remotedir/'*.*', localdir)すべてのファイルをダウンロードするために使用します
  4. 最後に開いたチャネルを閉じます。

上記のプロセス中に、ほとんどの場合、File Not Found または No such File Exceptions が発生し、一部のファイルがダウンロードされません。

なぜそれが起こるのか誰か教えてください。何が原因である可能性があります。この問題を解決する方法

以下は私が使用しているコードです:

ChannelSftp channelSftp = null;

try {
    channelSftp = getChannelConnectionUtil().openChannel(); //SFTPConnection.getSession().openChannel("sftp");  

    @SuppressWarnings("rawtypes")
    Vector numOfFiles = channelSftp.ls(ftpDir+"/*.*");

    if(numOfFiles.size() > 0){
        channelSftp.get(ftpDir+"/*.*",localDir); // Here I am getting error
    }
}  catch (Exception e) {
    e.printStackTrace();
} finally {
    getChannelConnectionUtil().disconnectChannel(channelSftp);
}
4

1 に答える 1

0

コードがなければ、問題を診断するのは困難です。ベクター サイズ チェックを忘れて、ベクター リストを繰り返し処理し、取得したファイルの数を数えることをお勧めします。以下は、リモート ホストからファイルをチェックしてダウンロードするために使用するコード ブロックです。

try {   
    ChannelSftp c = (ChannelSftp) channel;   
    c.lcd(localDir);
    logger.info("lcd " + c.lpwd());

    // Get a listing of the remote directory
    @SuppressWarnings("unchecked")
    Vector<ChannelSftp.LsEntry> list = c.ls("."); 
    logger.info("ls .");

    // iterate through objects in list, identifying specific file names
    for (ChannelSftp.LsEntry oListItem : list) {
        // output each item from directory listing for logs
        logger.info(oListItem.toString()); 

        // If it is a file (not a directory)
        if (!oListItem.getAttrs().isDir()) {
            // Grab the remote file ([remote filename], [local path/filename to write file to])

            logger.info("get " + oListItem.getFilename());
            c.get(oListItem.getFilename(), oListItem.getFilename());  // while testing, disable this or all of your test files will be grabbed

            grabCount++; 

            // Delete remote file
            //c.rm(oListItem.getFilename());  // Deleting remote files is not requried in every situation.
        }
    }

    // Report files grabbed to log
    if (grabCount == 0) { 
        logger.info("Found no new files to grab.");
    } else {
        logger.info("Retrieved " + grabCount + " new files.");
    }                           
} catch(SftpException e) {
    logger.warning(e.toString());
} finally {
    // disconnect session.  If this is not done, the job will hang and leave log files locked
    session.disconnect();
    logger.info("Session Closed");
}
于 2013-06-17T20:16:08.573 に答える