7

我对 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)
4

4 回答 4

11

取决于哪个版本的 VFS 解决方案会有所不同。对于 VFS 2.0,您必须在下面包含额外的配置选项。

SftpFileSystemConfigBuilder.getInstance( ).setUserDirIsRoot(opts, false);
于 2012-04-04T13:31:24.933 回答
3

根据文档,SFTP 文件系统不支持获取“目录内容”。

于 2012-03-12T09:38:16.417 回答
1

当我们将 VFS 版本 1.0 升级到 2.1 时遇到了同样的问题,发现文档给出了正确的方向,因为我们需要设置下面的标志以避免使用来自用户主目录的相对路径。

默认情况下,路径是相对于用户的主目录的。这可以通过以下方式更改:

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

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

于 2017-05-25T11:42:39.970 回答
0

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

FtpFileSystemConfigBuilder.getInstance().setPassiveMode(opts, true);
于 2015-09-10T14:16:02.833 回答