2010-01-04 74 views
1

我試圖從位於sftp服務器上的目錄中提取最新文件。我現在就做的方式是或多或少:Apache vfs:獲取目錄的最新更改文件(sftp)

public FileObject getLatestFile(String directory) throws FileSystemException { 
    FileObject fo = fsManager.resolveFile(this.host+directory, fsOptions); 
    FileObject latestFile = null; 
    long max = 0; 
    fo.getContent(). 
    for (FileObject fob : fo.getChildren()){ 
     if (fob.getContent().getLastModifiedTime() > max) { 
      max = fob.getContent().getLastModifiedTime(); 
      latestFile = fob; 
     } 
    } 
    return latestFile; 
} 

這種方法的問題是,我基本上是下載指定目錄下的所有文件,每次調用該方法。

有沒有更好的方法來做到這一點?

回答

3

您未下載內容。

如果您在源代碼中查找:

/** 
* Returns the file's content. 
*/ 
public FileContent getContent() throws FileSystemException 
{ 
    synchronized (fs) 
    { 
     attach(); 
     if (content == null) 
     { 
      content = new DefaultFileContent(this, getFileContentInfoFactory()); 
     } 
     return content; 
    } 
} 

調用的getContent方法會返回一個對象實現和類似尺寸越來越屬性,修改日期基本上探索遠程文件夾時,它的提取(每協議是不同的,但例如,當你列出你的所有文件屬性的FTP文件夾)。

對於SFTP這就是你實際調用:

protected long doGetLastModifiedTime() throws Exception 
{ 
    if (attrs == null 
      || (attrs.getFlags() & SftpATTRS.SSH_FILEXFER_ATTR_ACMODTIME) == 0) 
    { 
     throw new FileSystemException(
       "vfs.provider.sftp/unknown-modtime.error"); 
    } 
    return attrs.getMTime() * 1000L; 
} 

我同意,命名混亂,它意味着當的getContent調用的內容進行檢索,但實際上並非如此。

+0

很酷,很好的分析。代碼仍然很慢,這讓我猜測往返應該是怪罪。 謝謝。 – 2010-01-04 23:01:11

+0

如果您在SftpFileObject.doListChildrenResolved看,每一個孩子都有在創建時填充它的屬性:((SftpFileObject)FileObjectUtils.getAbstractFileObject(FO))setStat(stat.getAttrs());所以我們可以排除檢索每個項目的文件屬性的可能性(sfpt ls命令已經獲得)。 爲什麼它是慢這將是有趣的,看看,也許你可以做一個tcpdump的/ Wireshark的(Linux工具),看看是否作出額外的連接。 – 2010-01-05 16:20:03