2010-01-04 5 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

прохладно, хороший анализ. Тем не менее, код медленный, что заставляет меня угадать, что обвинения виноваты. Спасибо. –

+0

Если вы смотрите в SftpFileObject.doListChildrenResolved, каждый ребенок имеет свои атрибуты заселенных во время создания:. ((SftpFileObject) FileObjectUtils.getAbstractFileObject (Ф.О.)) setStat (stat.getAttrs()); поэтому мы можем исключить возможность получения атрибутов файлов для каждого элемента (команда sfpt ls уже получает это). Было бы интересно узнать, почему это происходит медленно, возможно, вы можете сделать tcpdump/Wireshark (инструменты Linux), чтобы увидеть, производят ли дополнительные подключения. –

Смежные вопросы