Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
2.1
-
None
-
ubuntu vsftpd
Description
FileObject.moveTo(FileObject) API doesn't work well for a Linux FTP, especially for setting a user directory as its root directory case,
For example, for a ubuntu vsftpd, which is having "/home/user1" as its root directory, when renaming "/test/test.txt" to "/test1/test1.txt", it will throw an exception.
In this case, it should consider the workingDirectory(would be "/home/user1") together and append it to the from/to path to make the API work.
Sample codes,
FileObject fileObject = null; FileObject toFileObject = null; try { StandardFileSystemManager fsManager = new StandardFileSystemManager(); fsManager.init(); FileSystemOptions fsOpts = new FileSystemOptions(); FtpFileSystemConfigBuilder.getInstance().setPassiveMode(fsOpts, true); FtpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(fsOpts, true); UserAuthenticator auth = new StaticUserAuthenticator(null, "<user>", "<password>"); DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(fsOpts, auth); fileObject = fsManager.resolveFile("ftp://<Replaced address>/test/test.txt", fsOpts); System.out.println("File exists:" + fileObject.exists()); toFileObject = fsManager.resolveFile("ftp://<Replaced address>/test1/test1.txt", fsOpts); System.out.println("File exists:" + toFileObject.exists()); if (!toFileObject.exists()) { toFileObject.createFile(); } fileObject.moveTo(toFileObject); } catch (FileSystemException ex) { ex.printStackTrace(); } finally { if (fileObject != null) { try { fileObject.close(); } catch (FileSystemException ex) { } } if (toFileObject != null) { try { toFileObject.close(); } catch (FileSystemException ex) { } } }
And the output,
File exists:true File exists:false org.apache.commons.vfs2.FileSystemException: Could not rename "ftp://<Replaced address>/test/test.txt" to "ftp://<Replaced address>/test1/test1.txt". at org.apache.commons.vfs2.provider.AbstractFileObject.moveTo(AbstractFileObject.java:1902) at TestFTP.main(TestFTP.java:59) Caused by: org.apache.commons.vfs2.FileSystemException: Could not rename FTP file "ftp://<Replaced address>/test/test.txt" to "ftp://<Replaced address>/test1/test1.txt". at org.apache.commons.vfs2.provider.ftp.FtpFileObject.doRename(FtpFileObject.java:524) at org.apache.commons.vfs2.provider.AbstractFileObject.moveTo(AbstractFileObject.java:1887)