2012-03-12 18 views
5

Ho un problema con Commons VFS. Voglio collegarmi a una directory usando SFTP ed elencarlo. Ecco il codice:Commons VFS - Impossibile elencare il contenuto di una directory

FileSystemOptions opts = new FileSystemOptions(); 
SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts, "no"); 
FileSystemManager fsManager = VFS.getManager(); 

FileObject sourceDir = fsManager.resolveFile(sourceUrl, opts); 
FileObject targetDir = fsManager.resolveFile(config.get("to")); 

for (FileObject sourceFile : sourceDir.getChildren()) { // here is the problem 
    FileObject targetFile = fsManager.resolveFile(targetDir + "/" + nodeName + "_" 
      + sourceFile.getName().getBaseName()); 
    logger.debug("Copying files. Source: " + sourceFile.getName().getPath() + " Target: " 
      + targetFile.getName().getPath()); 
} 

Sembra che il fsManager risolve in modo corretto, ma getChildren() fallisce. Ho scoperto che il sourceDir è un tipo IMAGINARY; lo dice il seguente codice

logger.debug(sourceDir.getType()); 

Ho controllato il file ed è una cartella ordinaria, non un collegamento o qualcosa del genere.

errore

org.apache.commons.vfs2.FileNotFolderException: Could not list the contents of "sftp://path/to/dir" because it is not a folder. 
    at org.apache.commons.vfs2.provider.AbstractFileObject.getChildren(AbstractFileObject.java:693) 
    at pkg.services.impl.QuartzJobEventLog.downloadEventLogs(QuartzJobEventLog.java:64) 
    at pkg.services.impl.QuartzJobEventLog.executeJob(QuartzJobEventLog.java:37) 
    at pkg.services.impl.AbstractQuartzJob.execute(AbstractQuartzJob.java:25) 
    at $QuartzJob_1360635dbcd.execute($QuartzJob_1360635dbcd.java) 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:203) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520) 

risposta

3

Secondo i documentation ottenere "il contenuto della directory" non è supportato per il filesystem SFTP.

+2

vedere @ risposta di Max. – hotshot309

10

A seconda della versione della soluzione VFS sarà diversa. Per VFS 2.0 devi includere l'ulteriore opzione di configurazione di seguito.

+1

Questo non era il problema qui. La tua soluzione è per le situazioni in cui vuoi (specialmente su Unix) accedere ad un percorso assoluto. – user219882

+3

Ho avuto questo problema esatto e l'impostazione di questa opzione di configurazione ha funzionato per me. Ora posso elencare il contenuto della directory tramite sftp. Il sito di documentazione di Apache è sbagliato. –

0

Stavo lavorando con FTP e non con protocollo SFTP ma ho riscontrato lo stesso problema descritto da Tomas. Che cosa ha aiutato è stata l'attivazione della modalità passiva

FtpFileSystemConfigBuilder.getInstance().setPassiveMode(opts, true); 
0

affrontato lo stesso problema quando abbiamo aggiornato il VFS versione 1.0 alla 2.1 e scoperto che la documentazione dà alla direzione giusta come abbiamo bisogno di impostare sotto la bandiera di evitare l'uso percorso relativo dalla directory home dell'utente .

Per impostazione predefinita, il percorso è relativo alla directory principale dell'utente. Questo può essere cambiato con:

FtpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(options, false); 

https://commons.apache.org/proper/commons-vfs/filesystems.html#SFTP

Problemi correlati