gpt4 book ai didi

java - 如何使用 JSch 判断 SFTP 上传是否成功

转载 作者:行者123 更新时间:2023-11-30 06:18:52 34 4
gpt4 key购买 nike

不幸的是,getExitStatus() 方法总是返回 -1,所以我不能用它来告诉我文件上传是否有效。我尝试使用 Channel 类的 getInputStream() 方法,但每当我尝试从输入流中读取时,我的代码就会永远阻塞,就好像 Channel 实例仍处于打开/连接状态(即使 isConnectedisClosed() 分别为 false 和 true - 表明 Channel 确实已关闭)。在我尝试从输入流中读取一个字节的数据后,以下代码总是阻塞:

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 是不成功的,否则我可以认为它是成功的?

最佳答案

I guess if a SFTPException is thrown that's unsuccessful otherwise i can assume it was successful?

没错。如果各种 ChannelSftp.put() 函数因任何原因失败,它们将抛出异常。如果你想仔细检查,你可以在远程文件名上调用 ChannelSftp.stat()...lstat() 来检查它。但请注意,在您有机会检查它之前,另一个进程可能会假设删除或移动远程文件。

您通常不需要访问 ChannelSftp 的输入或输出流。 getExitStatus() 会告诉您整个 SFTP session 的退出状态,而不是特定操作的结果。

JCraft 有 an example program illustrating how to do SFTP您可能会觉得有用。

关于java - 如何使用 JSch 判断 SFTP 上传是否成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23918070/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com