2011-05-18 154 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);