我的目标是轮询SFTP服务器以进行更改。我的第一个想法是检查目录中的文件数是否发生了变化。然后可能会对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();
}
这是使用apache commons vfs2 2.2.0。它可以正常运行,但是当服务器有太多文件时,只需要几分钟就可以获得计数(目前,需要2分钟才能获得具有~10k文件的服务器的计数) 。有没有什么方法可以更快地获得服务器上的计数或其他更改?
答案 0 :(得分:2)
不幸的是,SFTP协议中没有简单的方法来获取更改。如果您可以在服务器上运行某个守护程序,或者如果新文件的源可以创建/更新帮助程序文件,则可以选择在其名称或内容中创建具有最后修改时间的此类文件。
答案 1 :(得分:1)
我已经很好地了解了SFTP协议,开发了商用SFTP客户端和SFTP服务器(CompleteFTP),据我所知,协议中没有办法获取文件数在没有列出它的目录中。某些服务器(例如我们的服务器)提供了向可以从客户端调用的服务器添加自定义命令的方法,因此可以添加返回目录中文件数的自定义命令。 CompleteFTP还允许您编写自定义文件系统,以便您可以编写一个仅显示在执行列表后在给定时间戳之后已更改的文件的文件系统,这可能是另一种方法。我们的服务器只在Windows上运行,所以这可能是你的阻止。