3

我正在尝试将 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 不存在。A 做了一些测试来检查文件类型: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 文件夹?

4

2 回答 2

5

只需为 ftp 设置“被动”模式:

FtpFileSystemConfigBuilder.getInstance().setPassiveMode(opts, true);
于 2011-05-18T15:35:54.947 回答
0

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

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

我正在使用 vfs2 监视文件夹DefaultFileMonitorFileChangeEvent但无济于事。

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

深入挖掘表明FileObject's isReadable()exists()返回falseFileObject不可访问的意思。查看 的来源AbstractFileObject,正是根据这些检查来确定目录(Check AbstractFileObject getParent())。

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

FtpFileSystemConfigBuilder.getInstance( ).setUserDirIsRoot(opts,true);
于 2013-05-03T11:37:21.920 回答