Apache Commons VFS: работа с FTP - PullRequest
3 голосов
/ 18 мая 2011

Я пытаюсь использовать Apache Commons VFS с FTP.На моем FTP есть следующая структура файлов и папок:

/
/test
/test/in
/test/in/file1.txt
/test/in/file2.txt

Мне нужно подключиться и прочитать все файлы из папки / test / in (она постоянно меняется).Код:

        FileSystemManager fsManager = null;
        FileSystem fs = null;
        FileSystemOptions opts = new FileSystemOptions();
        fsManager = VFS.getManager();

        FileObject path = fsManager.resolveFile("ftp://user:password@my.ftp.host/test/in/", opts);

        fs = path.getFileSystem();

        //prints Connection successfully established to /test/in
        System.out.println("Connection successfully established to " + path.getName().getPath());

Но я не смог получить список файлов, потому что он говорит, что / test / in не существует.А сделал несколько тестов для проверки типов файлов: System.out.println(path.getType()); с разными путями.Результаты:

ftp: // пользователь: password@my.ftp.host/test - файл

ftp: // пользователь: пароль @ мой.ftp.host/test/in - мнимый

ftp: // пользователь: password@my.ftp.host/test/in/file1.txt - файл

FileType.IMAGINARY означает, что файл не существует.Есть идеи, как работать с папками ftp?

Ответы [ 2 ]

4 голосов
/ 18 мая 2011

Просто установите «пассивный» режим для ftp:

FtpFileSystemConfigBuilder.getInstance().setPassiveMode(opts, true);
0 голосов
/ 03 мая 2013

У меня была похожая проблема, и установка только пассивного режима не решила ее.

Папка, которую нужно было разрешить, была / FTP_HOME / data / xxxx

Я наблюдал за папкой с помощью vfs2 DefaultFileMonitor и прослушивал FileChangeEvent безрезультатно.

FileObject listendir =  fsManager.resolveFile("ftp://"+username+":"+password+"@"+server+"/data/" + "xxxx/",opts);

Копание немного глубже показало, что FileObject isReadable() и exists() вернули false, что означает, что FileObject недоступен. Глядя на источник AbstractFileObject, он зависел от этих проверок, чтобы определить каталог (Проверка AbstractFileObject getParent()).

Проблема заключалась в том, что AbstractFileObject просматривал файл относительно корня файловой системы, если только он явно не настроен на использование каталога User в качестве корня, следовательно, отсутствовал путь к файлу, который был передан. Таким образом, решение состояло в том, чтобы установить FtpFileSystemConfigBuilder, указывающий на то, что пользовательский каталог считается корневым.

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