我正在使用Apache Mina SSHD库,特别是sshd-sftp 2.3.0
编写一个SFTP客户端。我选择了它而不是SSHJ库,因为可以直接将String
写入远程文件,而且也没有不必要的依赖关系。
任务:将文件发送到SFTP服务器,以便备份以前的文件(如果有的话)。
我研究了SftpClient
类提供的所有可能性,其中我没有找到一种搜索文件的简单方法。
listDir
和readDir
方法,它们返回Iterable <DirEntry>
,但我怀疑它们将缓慢地工作在大量文件中。rename
方法重命名一个文件,但在我的例子中,可以有许多备份文件,我们必须首先找到一个空闲的文件名。当前的解决方案是获取文件的状态。如果没有这样的文件,那么将抛出一个SftpException
,例如,"SFTP错误(SSH_FX_NO_SUCH_FILE):没有这样的文件或目录“。可以分析这条消息,如果文件真的找不到,那么就不要再抛出这个异常了。以下是代码:
private boolean fileExists(SftpClient sftpClient, String remoteDest) throws IOException {
try {
return null != sftpClient.stat(remoteDest);
} catch (SftpException e) {
if (e.getStatus() != SftpConstants.SSH_FX_NO_SUCH_FILE) {
LOGGER.error("Error finding file {}", remoteDest);
throw e;
}
return false;
}
}
主要的问题是这个解决方案是丑陋的。
然而,在互联网上,我发现只有类似的解决方案使用库JSch和Trilead SSH-2 for Java。
也许还有另一种更简单、更有效的方法来检查SFTP服务器上的文件?
发布于 2019-09-06 10:33:02
这是正确的解决办法。
SFTP协议没有“文件存在”查询/请求。最接近的等价值实际上是"stat“查询/请求。因此,即使您最喜欢的SFTP库有“文件存在”方法/API,它也会在内部执行您的代码所做的工作。
JSch:使用JSch,是否有一种方法可以判断远程文件是否存在而不执行ls?中的等价物
https://stackoverflow.com/questions/57819606
复制相似问题