Как определить, была ли загрузка SFTP успешной с использованием JSch

1

К сожалению, метод getExitStatus() всегда возвращает -1, поэтому я не могу использовать это, чтобы сказать, работала ли загрузка файла. Я попытался использовать метод getInputStream() класса Channel но всякий раз, когда я пытался читать из isConnected isClosed() мой код блокировался навсегда, как если бы экземпляр Channel все еще был открыт/подключен (хотя isConnected и isClosed() были ложными и истинными соответственно - предполагая, что канал действительно закрыт). Следующий код всегда блокируется после того, как я попытаюсь прочитать байт данных из входного потока:

public class Put {

public static void main(String[] args) throws IOException {

    Session session = null; 
    Channel channel = null; 
    ChannelSftp channelSftp = null; 
    InputStream in = null; 
    JSch jsch = new JSch();

    try {
        jsch.setKnownHosts("known_hosts");
        session = jsch.getSession("user", "host", 22);
        session.setPassword("password");

        session.connect();
        channel = session.openChannel("sftp");
        channel.setInputStream(null);
        stdout = channel.getInputStream();

        channel.connect();
        channelSftp = (ChannelSftp)channel;
        channelSftp.cd("/path/to/sftp");


        channelSftp.put("/path/to/localfile", "/path/to/remotefile");

    } catch (JSchException e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    } catch (SftpException e) {
        System.out.println(e.id);
        System.out.println(e.getMessage());
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {

        if(channelSftp != null && channelSftp.isConnected())channelSftp.exit();
        if(channel != null && channel.isConnected()) channel.disconnect();
        if(session != null && session.isConnected()) session.disconnect();
    }

    System.out.println("Channel is connected? " + channel.isConnected()); // returns false as i would expect
    System.out.println("Channel is closed? " + channel.isClosed()); // returns true as i would expect
    System.out.println(stdout.available()); // returns 0
    System.out.println(stdout.read()); // code blocks here

}

}

Полагаю, мои вопросы:

  1. Почему мой код блокируется всякий раз, когда я пытаюсь читать из входного потока (хотя Channel действительно закрыт)

  2. Как узнать, работает ли загрузка файла или нет. Я предполагаю, что если исключение SFTPException выбрано неудачно, я могу предположить, что он был успешным?

Теги:
jsch
sftp

1 ответ

3
Лучший ответ

Я предполагаю, что если исключение SFTPException выбрано неудачно, я могу предположить, что он был успешным?

Это верно. Различные функции ChannelSftp.put() генерируют исключение, если они по какой-либо причине не работают. Если вы хотите дважды проверить, вы можете позвонить ChannelSftp.stat() или ...lstat() в удаленное имя файла, чтобы проверить его. Но имейте в виду, что другой процесс может гипотетически удалить или переместить удаленный файл, прежде чем вы сможете его проверить.

Обычно вам не требуется доступ к входным или выходным потокам ChannelSftp. getExitStatus() сообщит вам статус выхода сеанса SFTP в целом, а не результат конкретной операции.

В JCraft есть примерная программа, иллюстрирующая, как сделать SFTP, который может вам пригодиться.

  • 0
    Что, если файл уже был там, и на этот раз он не обновился? ChannelSftp.stat () все равно вернет правильный статус, и мы не узнаем, была ли загрузка успешной или нет

Ещё вопросы

Сообщество Overcoder
Наверх
Меню