2010-04-14 83 views
1

我正在使用JSch從SFTP服務器獲取文件,但我試圖找出一種方法來只獲取最舊的文件,並確保它目前沒有寫入。我想象我自己這樣做的方式是首先查找指定遠程文件夾中的哪個文件最早。然後我會檢查文件大小,等待x秒(可能大約10,爲了安全起見),然後再次檢查。如果文件大小沒有改變,我下載並處理它。但是,我不知道如何做到這一點!如果有人知道如何做到這一點,或知道其他支持SFTP的其他內置(我知道Apache Commons,但只有FTPS),那將是不勝感激。使用Java查找文件大小和上次修改的SFTP文件

在此先感謝。

回答

14

原來,這在JSch中完全可行,最難的部分是簡單地查找文檔。我使用的代碼如下,希望其他人會發現它有幫助! (我敢肯定有要作出優化,我知道,我知道。還有在別處定義的變量,但需要這將是能夠計算出來希望任何人!)

public static String oldestFile() { 
    Vector list = null; 
    int currentOldestTime; 
    int nextTime = 2140000000; //Made very big for future-proofing 
    ChannelSftp.LsEntry lsEntry = null; 
    SftpATTRS attrs = null; 
    String nextName = null; 
    try { 
     list = Main.chanSftp.ls("*.xml"); 
     if (list.isEmpty()) { 
      fileFound = false; 
     } 
     else { 
      lsEntry = (ChannelSftp.LsEntry) list.firstElement(); 
      oldestFile = lsEntry.getFilename(); 
      attrs = lsEntry.getAttrs(); 
      currentOldestTime = attrs.getMTime(); 
      for (Object sftpFile : list) { 
       lsEntry = (ChannelSftp.LsEntry) sftpFile; 
       nextName = lsEntry.getFilename(); 
       attrs = lsEntry.getAttrs(); 
       nextTime = attrs.getMTime(); 
       if (nextTime < currentOldestTime) { 
        oldestFile = nextName; 
        currentOldestTime = nextTime; 
       } 
      } 
      attrs = chanSftp.lstat(Main.oldestFile); 
      long size1 = attrs.getSize(); 
      System.out.println("-Ensuring file is not being written to (waiting 1 minute)"); 
      Thread.sleep(60000); //Wait a minute to make sure the file size isn't changing 
      attrs = chanSftp.lstat(Main.oldestFile); 
      long size2 = attrs.getSize(); 
      if (size1 == size2) { 
       System.out.println("-It isn't."); 
       fileFound = true; 
      } 
      else { 
       System.out.println("-It is."); 
       fileFound = false; 
      } 
     } 
    } catch (Exception ex) {ex.printStackTrace();} 
    return Main.oldestFile; 
} 
+3

只是一個說明:我寫了一些[JavaDoc for JSch](http://epaul.github.com/jsch-documentation/simple.javadoc/)。 – 2011-09-28 13:58:58

+0

我無法獲得通過它可以從遠程Unix檢索文件大小的部分。 'SftpATTRS'在我的Jsch jar文件中不是avaibale – 2014-03-25 10:19:08

1

我沒有直接回答您的問題,但它聽起來像您想要執行類似reliable file transfer的操作。這是網格計算中一個更大項目的一部分,現在顯然組織爲here。我不知道它是否包含安全功能,或者是否可以添加它們,但它是一個開源項目。

1

您可以使用支持SFTP的edtFTPj/PRO輕鬆完成此操作。

只需獲取目錄列表,然後按日期對列表進行排序。如果最近的日期不在最後幾分鐘,您可以下載。

+0

我忘了最重要的部分:這需要是免費的!謝謝你的提示,雖然:) – ryantmer 2010-04-29 21:58:38

-3

計算遠程服務器的文件夾大小隻需調用 ftpFolderSize(ftpFolderSize,client)目錄路徑,並且 將對象FTPClient作爲參數傳遞。它將返回文件夾的大小 。

僅適用於FTP。

import org.apache.commons.net.ftp.FTPClient; 

import org.apache.commons.net.ftp.FTPFile; 
import org.apache.commons.io.FileUtils; 

long dirSize = 0L; //global variable 

private long ftpFolderSize(String directoryPath,FTPClient client){ 

    try{ 
     client.changeWorkingDirectory(directoryPath); 
     FTPFile[] ftpFiles = client.listFiles(); 
     if(client.changeWorkingDirectory(directoryPath)) 
     { 
      for (FTPFile ftpFile : ftpFiles) { 
       if(ftpFile.isFile()){ 
        dirSize = dirSize+ftpFile.getSize();// file size is calculated 
       } 
       else if(ftpFile.isDirectory()) 
       { 
        dirSize = dirSize + 4096;//folder minimum size is 4kb 
        ftpFolderSize(directoryPath+"/"+ftpFile.getName(),client); 
       } 

      } 
     } 
    }catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return dirSize; 
} 
+1

這對於SFTP(這是與FTP不同的協議)不起作用。 – 2011-09-28 13:58:09