我正在尝试将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文件夹?
只需为 ftp 设置"被动"模式:
FtpFileSystemConfigBuilder.getInstance().setPassiveMode(opts, true);
我遇到了类似的问题,单独设置被动模式并不能解决它。
需要解析的文件夹是/FTP_HOME/data/xxxx
我正在使用 vfs2 DefaultFileMonitor
监视文件夹,并且正在监听FileChangeEvent
无济于事。
FileObject listendir = fsManager.resolveFile("ftp://"+username+":"+password+"@"+server+"/data/" + "xxxx/",opts);
深入挖掘表明FileObject
的isReadable()
和exists()
返回false
这意味着FileObject
无法访问。查看AbstractFileObject
的来源,正是依靠这些检查来确定目录(Check AbstractFileObject
getParent()
)。
问题是AbstractFileObject
相对于文件系统根目录查看文件,除非明确设置为使用用户目录作为根目录,因此错过了传递的文件路径。因此,解决方案是设置指示将用户目录视为根目录的FtpFileSystemConfigBuilder
。
FtpFileSystemConfigBuilder.getInstance( ).setUserDirIsRoot(opts,true);