[ https://issues.apache.org/jira/browse/VFS-634?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16302035#comment-16302035 ]
Bernd Eckenfels commented on VFS-634: ------------------------------------- I found out what the reaso is, but nut sure how to fix it best: - when the manager is closed it will start by closing and removing all file providers (including "file"). - Then it will close the fileReplicator and temporaryFileStore. Both have a list of `File` objects which it wants to remove and therefore invokes `context.toFileObject()` on those. - This will trigger parsing of the name via the still remembered existing DefaultLocalFileProvider.findFile. - This will invoke DefaultFileSystemManager.resolveName, but this does not find the FileProvider for the file scheme anymore. - Therefore it does fails through to the defaultProvider.parseURI which does basically work, however it decides that C: is not a slash-terminated URL and therefore declares it file. - On the next findFilesystem it will insert a new file: filesystem with a broken root file (missing C: as it called getParent() on it) - with that broken filesystem the shown exception is generated - the exception does not actually list the rootURIs it actually compared One option is to close the file replicator before the fileproviders. However this might lead to a unclear shutdown if some threads still resolve files. Another option would be to not close/remove the file provider or add it after the providers are cleared: providers.clear(); providers.put("file", localFileProvider); this does work as well, has less impact on the rest of the code but is also not very clear. A last option would be to make the replicant delete the java File objects without the help of VFS. They are already stored as file objects so this is not a big abstraction leak (but it does require to code some recursive delete it seems). Any ideas? I guess we also need to add a close() test which mocks the logger and verifies we dont get new warnings. > DefaultFileReplicator fails to clean all local files on close() > --------------------------------------------------------------- > > Key: VFS-634 > URL: https://issues.apache.org/jira/browse/VFS-634 > Project: Commons VFS > Issue Type: Bug > Affects Versions: 2.1 > Environment: windows > Reporter: Gilian HALOUIN > > Hi, > We face an issue when we use the DefaultFileSystemManager. > With this example : > {code:java} > import org.apache.commons.vfs2.FileObject; > import org.apache.commons.vfs2.FileSystemException; > import org.apache.commons.vfs2.Selectors; > import org.apache.commons.vfs2.VFS; > import org.apache.commons.vfs2.impl.DefaultFileSystemManager; > /** > * @author GHALOUIN > * > */ > public class TestVFS { > /** > * @param args > * @throws FileSystemException > */ > public static void main(final String[] args) throws FileSystemException { > final DefaultFileSystemManager vfsManager = > (DefaultFileSystemManager) VFS.getManager(); > final FileObject tempDir = vfsManager.resolveFile("tmp://simulation"); > final FileObject fileSrc = vfsManager.resolveFile("C:/toto.txt"); > tempDir.resolveFile("toto").copyFrom(fileSrc, Selectors.SELECT_SELF); > vfsManager.close(); > } > } > {code} > At the close call we have the following error : > INFOS: Using "C:\Users\ghalouin\AppData\Local\Temp\vfs_cache" as temporary > files store. > avr. 21, 2017 4:21:27 PM > org.apache.commons.vfs2.impl.StandardFileSystemManager warn > AVERTISSEMENT: Could not clean up temporary file "tmp_382_tempfs". > org.apache.commons.vfs2.FileSystemException: Incorrect file system URI > "file:///C:/" in name > "file:///C:/Users/ghalouin/AppData/Local/Temp/vfs_cache/tmp_382_tempfs", was > expecting "file:///C:". > at > org.apache.commons.vfs2.provider.AbstractFileSystem.resolveFile(AbstractFileSystem.java:324) > at > org.apache.commons.vfs2.provider.AbstractFileSystem.resolveFile(AbstractFileSystem.java:317) > at > org.apache.commons.vfs2.provider.AbstractOriginatingFileProvider.findFile(AbstractOriginatingFileProvider.java:84) > at > org.apache.commons.vfs2.provider.local.DefaultLocalFileProvider.findLocalFile(DefaultLocalFileProvider.java:106) > at > org.apache.commons.vfs2.provider.local.DefaultLocalFileProvider.findLocalFile(DefaultLocalFileProvider.java:119) > at > org.apache.commons.vfs2.impl.DefaultFileSystemManager.toFileObject(DefaultFileSystemManager.java:1003) > at > org.apache.commons.vfs2.impl.DefaultVfsComponentContext.toFileObject(DefaultVfsComponentContext.java:78) > at > org.apache.commons.vfs2.impl.DefaultFileReplicator.deleteFile(DefaultFileReplicator.java:172) > at > org.apache.commons.vfs2.impl.DefaultFileReplicator.close(DefaultFileReplicator.java:111) > at > org.apache.commons.vfs2.impl.PrivilegedFileReplicator$CloseAction.run(PrivilegedFileReplicator.java:195) > at java.security.AccessController.doPrivileged(Native Method) > at > org.apache.commons.vfs2.impl.PrivilegedFileReplicator.close(PrivilegedFileReplicator.java:113) > at > org.apache.commons.vfs2.impl.DefaultFileSystemManager.closeComponent(DefaultFileSystemManager.java:500) > at > org.apache.commons.vfs2.impl.DefaultFileSystemManager.close(DefaultFileSystemManager.java:604) > at testVFS.TestVFS.main(TestVFS.java:29) -- This message was sent by Atlassian JIRA (v6.4.14#64029)