Java 是否有一种简单的方法来检查SFTP服务器中是否有更改?

Java 是否有一种简单的方法来检查SFTP服务器中是否有更改?,java,sftp,apache-commons-vfs,Java,Sftp,Apache Commons Vfs,我的目标是轮询SFTP服务器的更改。我的第一个想法是检查dir中的文件数是否更改。然后可能会对dir中的更改进行一些附加检查 目前我正在使用以下工具: try { FileSystemOptions opts = new FileSystemOptions(); SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts, "no"); SftpFileSystem

我的目标是轮询SFTP服务器的更改。我的第一个想法是检查dir中的文件数是否更改。然后可能会对dir中的更改进行一些附加检查

目前我正在使用以下工具:

try {
        FileSystemOptions opts = new FileSystemOptions();
        SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts, "no");
        SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, true);
        SftpFileSystemConfigBuilder.getInstance().setTimeout(opts, 60000);

        FileSystemManager manager = VFS.getManager();
        FileObject remoteFile = manager.resolveFile(SFTP_URL, opts);

        FileObject[] fileObjects = remoteFile.getChildren();
        System.out.println(DateTime.now() + " --> total number of files: " + Objects.length);
        for (FileObject fileObject : fileObjects) {
            if (fileObject.getName().getBaseName().startsWith("zzzz")) {
                System.out.println("found one: " + Object.getName().getBaseName());
            }
        }
} catch (Exception e) {
        e.printStackTrace();
}

这是使用ApacheCommonsVFS2 2.2.0。它可以“正常”工作,但当服务器有太多文件时,仅获取计数就需要几分钟以上(目前,对于具有约10k文件的服务器,获取计数需要2分钟以上)。有没有办法更快地在服务器上获取计数或其他更改?

不幸的是,在SFTP协议中没有简单的方法来获取更改。如果您可以在服务器上运行某个守护程序,或者如果新文件的源可以创建/更新帮助文件,则可以选择创建名称或内容中包含上次修改时间的文件

我对SFTP协议非常熟悉,已经开发了商业SFTP客户端和SFTP服务器(),据我所知,在协议中没有办法在不列出目录的情况下获取目录中的文件计数。有些服务器(如我们的服务器)提供了向服务器添加自定义命令的方法,您可以从客户机调用这些命令,因此可以添加一个自定义命令来返回目录中的文件数。CompleteTTP还允许您编写自定义文件系统,这样您就有可能编写一个文件系统,在您进行列表时只显示在给定时间戳之后更改的文件,这可能是另一种方法。不过,我们的服务器只在Windows上运行,所以这可能是您的一个选择。

您需要筛选文件吗?或者算算一下。@Dezigo我的目标是轮询sftp服务器,并在有变化时做出反应。因此,理想情况下,我认为第一种方法是检查该目录中的文件数。也许你可以建议更好的检查方法?自定义命令似乎很有用,你能提供一些资源吗?很抱歉我的回复很慢。直到现在我才忘记检查我的StackOverflow收件箱。有两种方法可以通过Javascript(请参阅)和.NET(请参阅)添加自定义命令。感谢您的参考,我们一定会查看它们!顺便说一下,在下一个版本(9.0)中,您将能够从Javascript扩展访问CompleteTP的虚拟文件系统。这样,您所需的自定义命令将按如下方式实现:
system.getFile(path).getFiles().length
其中
path
是虚拟文件系统中的路径,即与您在常规SFTP中使用的路径相同。