我有一个场景,首先我需要将文件从源复制到目标 1,然后将相同的文件从源移动到目标 2 目录。
所有这三个文件夹(Source、Destination1 和 Destination2)均位于远程服务器中。因此,为了实现相同的目的,我使用 JSch API 来建立 SFTP 连接。
由于 JSch 不提供任何远程复制任何文件的方法,因此我使用 Unix cp
命令来实现相同的目的。但是有重命名命令可以移动文件。
问题是,当我运行时,程序文件没有被复制,但移动成功。原因似乎是 Unix 复制命令需要时间来执行该操作,但在执行移动命令之前。由于我使用 Unix 的 cp 命令,Java 不会等待(像 Fire and Forget 一样)完成复制命令。
为了确认我对这个问题的理解,我在复制命令之后放置了 sleep()
并且文件正在成功复制和移动。但这不是一个好的设计。
有人可以帮我解决同样的问题吗?有什么方法可以让java程序等待Unix cp
命令成功执行。
下面是复制文件的代码片段:
String command1= "cp "+BackUpQueue+"/"+trimmedString+" "+HUBQueue+"/"+trimmedString ;
channel1=session.openChannel("exec");
((ChannelExec)channel1).setCommand(command1);
channel1.setInputStream(null);
((ChannelExec)channel1).setErrStream(System.err);
InputStream in=channel1.getInputStream();
channel1.connect();
in.close();
移动文件的代码:
channelSftp.rename(SFTPWORKINGDIR+"/"+trimmedString, BackUpQueue+"/"+trimmedString);
最佳答案
您必须等待“exec” channel 完成/关闭,然后才能在“sftp” channel 上安全地运行重命名
。
关于java - Unix Copy & JSch 命令在 SFTP 时产生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26916128/