在 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 提供的所有可能性,但在其中我没有找到一种简单的方法来搜索文件。
- 有
listDir
和readDir
方法,它们returnIterable <DirEntry>
,但我怀疑如果有大量文件,它们会工作得很慢。
- 我们可以简单的用
rename
的方法强制重命名一个文件,但是我的情况下可能有很多备份文件,我们必须先找到一个空闲的文件名。
目前的解决方案是获取文件的状态。如果没有这样的文件,则会抛出一个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?
我正在使用 Apache Mina SSHD library, specifically sshd-sftp 2.3.0
. I chose it instead of the SSHJ library 编写 SFTP 客户端,因为可以直接将 String
写入远程文件,并且也没有不必要的依赖项。
任务:将文件发送到 SFTP 服务器时,如果有的话,对之前的文件进行备份。
我研究了 SftpClient
class 提供的所有可能性,但在其中我没有找到一种简单的方法来搜索文件。
- 有
listDir
和readDir
方法,它们returnIterable <DirEntry>
,但我怀疑如果有大量文件,它们会工作得很慢。 - 我们可以简单的用
rename
的方法强制重命名一个文件,但是我的情况下可能有很多备份文件,我们必须先找到一个空闲的文件名。
目前的解决方案是获取文件的状态。如果没有这样的文件,则会抛出一个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?