2017-09-05 8 views
1

vfs2ライブラリを使用してftpサーバーで作業しているときに、VFS.setUriStyle(true)を有効にしてライブラリが作業ディレクトリを親ディレクトリに変更する必要があった私が操作しているターゲットファイル(cwd directoryName)。apache VFS2 uriStyle - 絶対パスが二重スラッシュで終わる

しかし、UriStyleが有効になっていると、すべてがルートに対して相対的に解決されています。ルートが "//"でない場合は、問題ではないでしょう。

クラスGenericFileNameはルートの絶対パスを "/"に設定し、メソッドgetPath()は "/" + getUriTrailer()を返し、ルートの場合は常に "//"を返します。相対的に解決されるすべてのものは、2つの点がそのパスに進む。

私は次のコードを実行している場合を意味します

public class RemoteFileTest { 
public static void main(String[] args) { 
    // Options for a RemoteFileObject connection 
    VFS.setUriStyle(true); 
    FileSystemOptions options = new FileSystemOptions(); 
    // we doing an ftp connection, hence we use the ftpConfigBuilder 
    // we want to work in passive mode 
    FtpFileSystemConfigBuilder.getInstance().setPassiveMode(options, true); 
    FtpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(options, false); 
    // DefaultFileSystemConfigBuilder.getInstance().setRootURI(options, "/newRoot/"); 
    // System.out.println(DefaultFileSystemConfigBuilder.getInstance().getRootURI(options)); 
    // ftp://localhost:21/ 

    StaticUserAuthenticator auth = new StaticUserAuthenticator("", "user", "pass"); 
    try { 
     DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(options, auth); 
    } catch (FileSystemException e) { 
     e.printStackTrace(); 
     return; 
    } 

    // A FileSystemManager creates an abstract FileObject linked to are desired RemoteFile. 
    // That link is just simulated and not yet real. 
    FileSystemManager manager; 
    try { 
     manager = VFS.getManager(); 
    } catch (FileSystemException e) { 
     e.printStackTrace(); 
     return; 
    } 

    try (FileObject remoteFile = manager.resolveFile("ftp://localhost:21/sub_folder/test.txt", options)) { 

     System.out.println("Is Folder " + remoteFile.isFolder()); 
     System.out.println("Is File " + remoteFile.isFile()); 

    } catch (FileSystemException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     return; 
    } 

}} 

を私はftpサーバとのこの相互作用を受ける:

USER user 
PASS **** 
TYPE I 
CWD // 
SYST 
PASV 
LIST ..sub_folder/ 
PWD 
CWD ..sub_folder/ 

私は相互作用がちょうどこのようになりたいが、二つなしディレクトリの前にドットがあります。再び

無効uriStyle:

種類は、以下のように バリー

答えて

0

はそれを修正について。 自分の作成したカスタムマネージャを作成する自分のVFSクラスを作成しました。 そのマネージャはFtpFileProviderをカスタムのもので上書きします。これは、ルートをカスタム選択さ​​れたものに設定するだけで、目的の動作を引き起こします。

import org.apache.commons.vfs2.FileName; 
import org.apache.commons.vfs2.FileObject; 
import org.apache.commons.vfs2.FileSystem; 
import org.apache.commons.vfs2.FileSystemException; 
import org.apache.commons.vfs2.FileSystemOptions; 
import org.apache.commons.vfs2.impl.DefaultFileSystemConfigBuilder; 
import org.apache.commons.vfs2.provider.ftp.FtpFileProvider; 

public class AdvancedFtpFileProvider extends FtpFileProvider { 
    public AdvancedFtpFileProvider() { 
     super(); 
     // setFileNameParser(AdvancedFtpFileNameParser.getInstance()); 
    } 

    @Override 
    protected FileObject findFile(FileName name, FileSystemOptions fileSystemOptions) throws FileSystemException { 
     // Check in the cache for the file system 
     //getContext().getFileSystemManager().resolveName... resolves the configured RootUri relative to the selected root (name.getRoot()). This calls cwd to the selectedRoot and operates from there with relatives urls towards the new root! 
     final FileName rootName = getContext().getFileSystemManager().resolveName(name.getRoot(), DefaultFileSystemConfigBuilder.getInstance().getRootURI(fileSystemOptions)); 

     final FileSystem fs = getFileSystem(rootName, fileSystemOptions); 

     // Locate the file 
     // return fs.resolveFile(name.getPath()); 
     return fs.resolveFile(name); 
    } 
}