2015-06-25 50 views
3

我的目标是轮询SFTP服务器的更改。我的第一个想法是检查dir文件的数量是否发生了变化。然后,可能需要额外检查目录中的更改。是否有一种简单的方法来检查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的百科全书VFS2 2.2.0。它工作“很好”,但是当服务器文件太多时,只需要几分钟就可以获得计数(目前,需要2分钟才能获得具有〜10k文件的服务器的计数)。任何方式来更快地获得服务器上的计数或其他更改?

+0

你需要过滤文件吗?或者只是数一数。 – Dezigo

+0

@Dezigo我的目标是轮询sftp服务器,并在发生变化时做出反应。所以理想情况下,我认为第一种方法是检查该目录中的文件数量。也许你可以提出更好的检查方法? – iCodeLikeImDrunk

回答

2

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

1

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

+0

自定义命令似乎很有用,你可以提供任何资源吗? – iCodeLikeImDrunk

+1

对不起,我的答复很慢。直到现在,我忘了检查我的StackOverflow收件箱。有两种方法可以通过Javascript添加自定义命令(参见[这里](http://enterprisedt.com/products/completeftp/doc/guide/html/customcommandscript.html))和.NET(参见[here](http ://enterprisedt.com/products/completeftp/doc/guide/html/sitecommandextensions.html))。 – HansA

+0

感谢您的参考,一定会检查出来! – iCodeLikeImDrunk

相关问题