2010-01-04 5 views
1

J'essaie de sortir le dernier fichier d'un répertoire, qui se trouve sur un serveur sftp. La façon dont je le fais droit est plus ou moins maintenant:Apache vfs: récupère le dernier fichier modifié d'un répertoire (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; 
} 

Le problème avec cette approche est que je télécharge essentiellement tous les fichiers dans le répertoire donné, chaque fois que la méthode est appelée.

Y a-t-il une meilleure façon de faire cela?

Répondre

3

Vous ne téléchargez pas le contenu.

Si vous regardez dans le code source:

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

appelant getContent retourne juste une implémentation d'objets et d'obtenir des attributs tels que la taille, la date de modification, fondamentalement, il est extrait lors de l'exploration du dossier distant (chaque protocole est différent, mais par exemple, lorsque vous listez un dossier FTP, vous obtenez tous les attributs de fichiers).

Pour SFTP ce que vous appelez en fait:

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

Je suis d'accord, la dénomination est source de confusion et il implique que le contenu est récupéré lorsque getContent est invoqué, mais est en fait pas.

+0

cool, belle analyse. Encore le code est lent, ce qui me fait deviner que les allers-retours sont à blâmer. Merci. –

+0

Si vous regardez dans SftpFileObject.doListChildrenResolved, chaque enfant a ses attributs remplis au moment de la création: ((SftpFileObject) FileObjectUtils.getAbstractFileObject (fo)). SetStat (stat.getAttrs()); Nous pouvons donc exclure la possibilité de récupérer des attributs de fichier par item (la commande sfpt ls l'obtient déjà). Il serait intéressant de voir pourquoi il est lent, peut-être que vous pouvez faire un tcpdump/Wireshark (outils Linux) pour voir si faire des connexions supplémentaires. –