3

我的目标是轮询 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 分钟以上)。有什么方法可以更快地获得服务器上的计数或其他更改?

4

2 回答 2

2

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

于 2015-06-26T08:13:41.927 回答
1

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

于 2015-06-27T07:46:02.637 回答