我正在尝试从位于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;
}
这种方法的问题在于,每次调用方法时,我基本上都会下载给定目录中的每个文件。
有没有更好的方法呢?
答案 0 :(得分: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但实际上没有调用内容时会检索内容。