2

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;
}

このアプローチの問題は、メソッドが呼び出されるたびに、基本的に指定されたディレクトリ内のすべてのファイルをダウンロードしていることです。

これを行うより良い方法はありますか?

4

1 に答える 1

6

コンテンツをダウンロードしていません。

ソースコードを見ると:

/**
 * 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 が呼び出されたときにコンテンツが取得されることを意味しますが、実際にはそうではありません。

于 2010-01-04T17:32:48.137 に答える