Apache Commons VFS:使用FTP

时间:2011-05-18 14:18:42

标签: java ftp apache-commons-vfs

我正在尝试使用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://user:password@my.ftp.host/test - 档案

ftp://user:password@my.ftp.host/test/in - 虚构

ftp://user:password@my.ftp.host/test/in/file1.txt - 档案

FileType.IMAGINARY表示该文件不存在。 任何想法如何使用ftp文件夹?

2 个答案:

答案 0 :(得分:4)

为ftp设置'被动'模式:

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

答案 1 :(得分:0)

我有一个类似的问题,单独设置被动模式并没有解决它。

需要解析的文件夹是/ FTP_HOME / data / xxxx

我正在使用vfs2 DefaultFileMonitor监控该文件夹,并且正在FileChangeEvent收听,但无济于事。

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

深入挖掘表明FileObject的{​​{1}}和isReadable()返回了exists(),意味着false无法访问。 查看FileObject的来源,根据这些检查来确定目录(检查AbstractFileObject AbstractFileObject)。

问题是getParent()查看相对于文件系统root的文件,除非明确设置为使用User目录作为根目录,因此错过了传递的文件路径。因此解决方案是设置AbstractFileObject指示将用户目录视为根。

FtpFileSystemConfigBuilder