2015-06-25 75 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

相關問題