2012-03-12 99 views
5

我对Commons VFS有问题。我想要使​​用SFTP连接到一个目录并列出它。下面是代码:Commons VFS - 无法列出目录的内容

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

看来,fsManager解析正确,但getChildren()失败。我发现sourceDir是一个IMAGINARY类型;下面的代码说它

logger.debug(sourceDir.getType()); 

我检查了文件,它是一个普通的文件夹 - 不是一个链接或类似的东西。

错误

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) 

回答

3

按照documentation获得 “目录内容” 不支持的文件系统SFTP。

+2

见@最多的回答。 – hotshot309 2013-11-19 17:39:13

10

取决于哪个版本的VFS解决方案会有所不同。对于VFS 2.0,您必须在下面添加其他配置选项。

SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, false); 
+1

这不是问题。您的解决方案适用于您希望(特别是在Unix上)访问绝对路径的情况。 – user219882 2012-04-05 07:57:14

+3

我有这个确切的问题,并设置此配置选项为我工作。我现在可以通过sftp列出目录内容。 Apache文档网站是错误的。 – 2013-05-12 20:36:46

0

我正在使用FTP而不是SFTP协议,但遇到了与Tomas描述的相同的问题。是什么帮助被启用被动模式

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

面临着同样的问题,当我们升级的VFS版本1.0到2.1,发现文档提供给正确的方向,我们需要设置下面的标志,以避免使用从用户的主目录的相对路径。

默认情况下,路径是相对于用户的主目录。这可以被改变:

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

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