我对Commons VFS有问题。我想使用SFTP连接到一个目录并列出它。这是代码:
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)
根据VFS解决方案的版本不同。对于VFS 2.0,您必须在下面包含额外的配置选项。
SftpFileSystemConfigBuilder.getInstance( ).setUserDirIsRoot(opts, false);
根据文档,SFTP文件系统不支持获取"目录内容"。
当我们将VFS版本1.0升级到2.1时,遇到了同样的问题,并发现文档给出了正确的方向,因为我们需要设置以下标志,以避免使用来自用户主目录的相对路径。
默认情况下,路径是相对于用户的主目录的。这可以通过以下方式更改:
FtpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(options, false);
https://commons.apache.org/proper/commons-vfs/filesystems.html#SFTP
我使用的是FTP,而不是SFTP协议,但遇到了与Tomas描述的相同的问题。帮助实现被动模式
FtpFileSystemConfigBuilder.getInstance().setPassiveMode(opts, true);