首页 > 解决方案 > 使用 Apache Commons VFS 将目标文件夹复制到文件中

问题描述

我正在尝试使用 Apache Commons VFS 将本地文件系统中的单个文件复制到远程 SFTP 服务器。为了模仿实际问题,我编写了以下代码,它会产生相同的问题。

FileSystemManager fileSystemManager = VFS.getManager();
FileObject fileToCopy = fileSystemManager.resolveFile("/tmp/submission/2004220.csv");
FileObject destinationDirectory = fileSystemManager.resolveFile("/tmp/test");
destinationDirectory.copyFrom(fileToCopy,Selectors.SELECT_SELF);

执行上述代码时,/tmp/test目录将转换为文件,而不是将文件复制到2004220.csv文件/tmp/test夹中。通过文件选择器选择所有文件作为子文件,我能够在两个文件夹之间成功复制文件Selectors.SELECT_CHILDREN,但只有在将单个文件复制到目录时才会遇到这个问题。

标签: javaapache-commonsvfsapache-commons-vfs

解决方案


最后,我能够找到解决方法。我不确定上述问题是由于 VFS 中的问题还是 VFS 不希望处理文件夹之间的单个文件复制的方式。无论如何,这是我的解决方案。

如果你想在 FileObject 中保留完整的文件路径,

FileSystemManager fileSystemManager = VFS.getManager();
FileObject fileToCopy = fileSystemManager.resolveFile("/tmp/submission/2004220.csv");
FileObject destinationDirectory = fileSystemManager.resolveFile("/tmp/test");
NameFileFilter nameFileFilter = new NameFileFilter(Arrays.asList(fileToCopy.getName().getBaseName()));
FileSelector fileSelector = new FileFilterSelector(nameFileFilter);
destinationDirectory.copyFrom(fileToCopy.getParent(),fileSelector);

要不然,

FileSystemManager fileSystemManager = VFS.getManager();
FileObject fileToCopy = fileSystemManager.resolveFile("/tmp/submission");
FileObject destinationDirectory = fileSystemManager.resolveFile("/tmp/test");
NameFileFilter nameFileFilter = new NameFileFilter(Arrays.asList("2004220.csv"));
FileSelector fileSelector = new FileFilterSelector(nameFileFilter);
destinationDirectory.copyFrom(fileToCopy,fileSelector);

推荐阅读