Apache vfs: получить последний измененный файл каталога (sftp) - PullRequest
1 голос
/ 04 января 2010

Я пытаюсь вытащить последний файл из каталога, который находится на сервере 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;
}

Проблема этого подхода заключается в том, что я в основном загружаю каждый файл в данном каталоге, каждый раз, когда вызывается метод.

Есть ли лучший способ сделать это?

1 Ответ

3 голосов
/ 04 января 2010

Вы не загружаете контент.

Если вы посмотрите в исходном коде:

/**
 * 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, но на самом деле это не так.

...