Commons VFS - Невозможно перечислить содержимое каталога - PullRequest
6 голосов
/ 12 марта 2012

У меня проблема с 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 ]

12 голосов
/ 04 апреля 2012

В зависимости от того, какая версия решения VFS будет отличаться.Для VFS 2.0 вы должны включить дополнительную опцию конфигурации ниже.

SftpFileSystemConfigBuilder.getInstance( ).setUserDirIsRoot(opts, false);
3 голосов
/ 12 марта 2012

Согласно документации получение "содержимого каталога" не поддерживается для файловой системы SFTP.

1 голос
/ 25 мая 2017

Столкнулся с той же проблемой, когда мы обновили VFS версии 1.0 до 2.1 и обнаружили, что документация дает правильное направление, поскольку нам нужно установить флаг ниже, чтобы избежать использования относительного пути из домашнего каталога пользователя.

По умолчанию путь указывается относительно домашнего каталога пользователя.Это можно изменить с помощью:

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

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

0 голосов
/ 10 сентября 2015

Я работал с FTP, а не с протоколом SFTP, но столкнулся с той же проблемой, что и Томас. Помогло включение пассивного режима

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