2011-05-18 147 views
2

我正在尝试将Apache Commons VFS与FTP一起使用。在我的FTP一个有文件和文件夹的一个结构:Apache Commons VFS:使用FTP

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

我需要连接和文件夹/读取测试的所有文件/在(它时刻都在变化)。代码:

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

     FileObject path = fsManager.resolveFile("ftp://user:[email protected]/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:[email protected]/test - 文件

ftp://user:[email protected]/test/in - 虚

ftp://user:[email protected]/test/in/file1.txt - 文件

FileType.IMAGINARY意味着文件不存在。 任何想法如何使用FTP文件夹?

回答

4

只需设置“被动”模式FTP:

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

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

需要加以解决,该文件夹/ FTP_HOME /数据/ XXXX

我正在监测使用VFS2 DefaultFileMonitor的文件夹,并听音两方面对FileChangeEvent为无济于事。

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

挖得更深一些,表明FileObjectisReadable()exists()返回false这意味着FileObject不可访问。 看着AbstractFileObject的来源,它取决于这些检查来确定目录(检查AbstractFileObjectgetParent())。

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

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