2010-09-29 81 views
8

試圖創建一個簡單的插件,只需連接到一個FTP站點,查找最新的文件,然後下載它。但是,它沒有得到最新的文件。從ftp獲取最新文件

我使用的是org.apache.commons.net.ftp.ftpclient。

這裏是我的代碼

public static void main(String[] args) 
    { 
    FTPClient client = new FTPClient(); 
    try 
    { 
    client.connect(host); 
    client.login(user, pwd); 
    FTPFile[] files = client.listFiles(); 
    FTPFile lastFile = lastFileModified(files); 
    System.out.println(lastFile.getName()); 
    client.disconnect(); 
    } 
    catch(SocketException e) 
    { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    catch(IOException e) 
    { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

} 

public static FTPFile lastFileModified(FTPFile[] files) { 
    Date lastMod = files[0].getTimestamp().getTime(); 
    FTPFile choice = null; 
    for (FTPFile file : files) { 
      if (file.getTimestamp().getTime().after(lastMod)) { 
        choice = file; 
        lastMod = file.getTimestamp().getTime(); 
      } 
    } 
    return choice; 
} 

它獲取文件的列表,然後返回一個文件,它只是不是最新的文件。是否有任何其他方式來比較文件修改日期使用FTPClient或任何人都可以指向我的方向,我做錯了什麼。謝謝。

+0

是getTImestamp(報告正確的價值觀爲所有的文件嗎? – 2010-09-29 20:09:15

+0

yes ............. – Ryan 2010-09-29 23:56:36

回答

7

而不是你的「lastFileModified」方法,我會創建一個比較器。這將是更容易編寫的排序方法:

public class LastModifiedComparator implements Comparator<FTPFile> { 

    public int compare(FTPFile f1, FTPFile f2) { 
     return f1.getTimestamp().compareTo(f2.getTimeStamp()); 
    } 
} 

然後,讓「最後一個」 FTPFile要容易得多:

public FTPFile getMaxLastModified(FTPFile[] ftpFiles) { 
    return Collections.max(Arrays.asList(ftpFiles), new LastModifiedComparator()); 
} 

要回到你的問題:「上次更改」時間戳沒有鏈接到FTP上傳順序。當您通過FTP協議上傳文件時,可能會保留文件的原始時間戳。

因此,如果file1早於file2,則即使file2在FTP服務器上的file1之前上傳,您的方法也將始終返回file2。

我認爲不可能確定最後上傳的文件。此信息不是由FTP協議存儲的。 你可以做,只有當你超載你的FTP客戶端的「放」的方法:)

public void put(File file) { 
    // upload code 
    FTPFile ftpFile = getJustUploadedFile(file); 
    ftpFile.setTimestamp(new Calendar()); // Now! 
} 
+0

是的比較器也沒有工作,我會研究FTP客戶端,看看這是做什麼,謝謝你的信息。 – Ryan 2010-09-29 19:47:06

+0

可保留原始時間戳_may_。 – 2010-09-29 20:07:57

+0

確實如此:它依賴於FTP客戶端。我編輯我的帖子,以包括你的精度。非常感謝。 – 2010-09-29 20:22:07

0

我只看到一個錯誤:

FTPFile choice = null; 

如果第一個文件是最新修改的文​​件,則該方法將返回null,造成潛在NullPointerException

將其更改爲

FTPFile choice = files[0]; 

和邏輯應該是正確的。

如果它仍然沒有返回預期的文件,那麼很可能有問題的文件根本沒有預期的最後修改日期。添加像這樣的for循環的方法:

System.out.println(file.getTimestamp().getTime() + " - " + file.getName()); 

而且仔細看。

+1

同樣的結果是,在系統輸出中添加時間顯示2010年9月29日星期三15:28:00,這是FTP同時顯示9/29/2010 3:28:00 PM。最新的文件實際上是9/29/2010 7:23:00 PM,並且在這些日期之間有大約50個文件。 – Ryan 2010-09-29 19:32:26

+0

所以,你在比較不同地方的時間(用Java和某些FTP管理器工具)?您是否按照我的答案中的建議檢查了「for(FTPFile file:files)'循環內的所有文件的時間戳記? FTP管理器工具可能使用不同的時區。 – BalusC 2010-09-29 19:51:09

+0

這個由我剛開始顯示的文件名,所以我可以仔細檢查,看看它是正確的文件之前,我繼續任何事情,低,看到這發生。時代都到了代碼中。在視覺上,當你輸出時間,然後與你在視覺上看到的文件進行比較的時候,只有一個是軍事時間,另一個不是。但在代碼中,它們都是相同的值。 – Ryan 2010-09-29 23:59:25