【问题标题】:Is there a simple method to check if there are changes in a SFTP server?有没有简单的方法来检查 SFTP 服务器是否有变化?
【发布时间】:2015-06-25 19:33:15
【问题描述】:

我的目标是轮询 SFTP 服务器以进行更改。我的第一个想法是检查目录中的文件数量是否改变。然后可能会额外检查目录中的更改。

目前我正在使用以下内容:

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

这是使用 apache commons vfs2 2.2.0。它工作“很好”,但是当服务器有太多文件时,只需要几分钟才能获得计数(目前,获得大约 10k 文件的服务器的计数需要 2 分钟以上)。有什么方法可以更快地获取服务器上的计数或其他更改?

【问题讨论】:

  • 您需要过滤文件吗?或者只是数一数。
  • @Dezigo 我的目标是轮询 sftp 服务器并在有变化时做出反应。所以理想情况下,我认为第一种方法是检查该目录中的文件数。也许您可以提出更好的检查方法?

标签: java sftp apache-commons-vfs


【解决方案1】:

遗憾的是,在 SFTP 协议中没有简单的方法来获取更改。如果您可以在服务器上运行一些守护程序,或者如果新文件的源可以创建/更新帮助文件,则可以选择在其名称或内容中创建具有最后修改时间的此类文件。

【讨论】:

    【解决方案2】:

    我非常了解 SFTP 协议,开发了商业 SFTP 客户端和 SFTP 服务器 (CompleteFTP),据我所知,协议中没有办法在不列出目录的情况下获取目录中的文件数.某些服务器(例如我们的服务器)提供了将自定义命令添加到您可以从客户端调用的服务器的方法,因此可以添加返回目录中文件数量的自定义命令。 CompleteFTP 还允许您编写自定义文件系统,因此您可能会编写一个仅显示在您进行列表时在给定时间戳之后发生更改的文件的文件系统,这可能是另一种方法。不过,我们的服务器只在 Windows 上运行,所以这对你来说可能是个大问题。

    【讨论】:

    • 自定义命令似乎很有用,你能提供任何资源吗?
    • 对不起,我的回复很慢。直到现在我都忘了检查我的 StackOverflow 收件箱。有两种方法可以通过 Javascript(参见 here)和 .NET(参见 here)添加自定义命令。
    • 感谢您的参考,一定会检查出来!
    • 顺便说一下,在下一个版本 (9.0) 中,您将能够从 Javascript 扩展访问 CompleteFTP 的虚拟文件系统。这样,您需要的自定义命令将按如下方式实现:system.getFile(path).getFiles().length 其中path 是虚拟文件系统中的路径,即与您在常规 SFTP 中使用的路径相同。
    猜你喜欢
    • 2021-06-27
    • 2011-08-08
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    相关资源
    最近更新 更多