在 Java 中验证 SFTP 服务器上文件是否存在的简单方法

A simple way to verify the existence of a file on the SFTP server in Java

我正在使用 Apache Mina SSHD library, specifically sshd-sftp 2.3.0. I chose it instead of the SSHJ library 编写 SFTP 客户端,因为可以直接将 String 写入远程文件,并且也没有不必要的依赖项。

任务:将文件发送到 SFTP 服务器时,如果有的话,对之前的文件进行备份。

我研究了 SftpClient class 提供的所有可能性,但在其中我没有找到一种简单的方法来搜索文件。

目前的解决方案是获取文件的状态。如果没有这样的文件,则会抛出一个SftpException,例如"SFTP error (SSH_FX_NO_SUCH_FILE): No such file or directory"。这个消息是可以分析的,如果真的没有找到文件,那么就不要再抛这个异常了。这是代码:

    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;
        }
    }

主要问题是这个解决方案很难看。

然而,在 Internet 上我只找到了使用库的类似解决方案 JSch and Trilead SSH-2 for Java

也许还有另一种更简单、更有效的方法来检查 SFTP 服务器上的文件?

这是正确的解决方案。

SFTP 协议没有 “文件是否存在” query/request。最接近的等效项实际上是 "stat" query/request。因此,即使您最喜欢的 SFTP 库具有 “文件是否存在” method/API,它也会在内部执行您的代码执行的操作。

JSch 中的等价物:Using JSch, is there a way to tell if a remote file exists without doing an ls?