【发布时间】:2019-03-21 16:32:56
【问题描述】:
试图将文件从子目录连同结构一起移动到父目录。我无法使用Files.move() 完成此操作。为了说明这个问题,请参见下面的目录结构。
$ tree
.
└── b
├── c
│ ├── cfile.gtxgt
│ └── d
│ ├── dfile.txt
│ └── e
└── x
└── y
└── z
├── 2.txt
└── p
├── file1.txt
└── q
├── file
├── file2.txt
└── r
└── 123.txt
我想通过 Java 模拟下面的移动命令。
$ mv b/x/y/z/* b/c
b/x/y/z/2.txt -> b/c/2.txt
b/x/y/z/p -> b/c/p
并且输出应该类似于
$ tree
.
└── b
├── c
│ ├── 2.txt
│ ├── cfile.gtxgt
│ ├── d
│ │ ├── dfile.txt
│ │ └── e
│ └── p
│ ├── file1.txt
│ └── q
│ ├── file
│ ├── file2.txt
│ └── r
│ └── 123.txt
└── x
└── y
└── z
在此移动中,z 目录下的所有文件和目录都已移动到c。
我已经尝试过这样做:
public static void main(String[] args) throws IOException{
String aPath = "/tmp/test/a/";
String relativePathTomove = "b/x/y/z/";
String relativePathToMoveTo = "b/c";
Files.move(Paths.get(aPath, relativePathTomove), Paths.get(aPath, relativePathToMoveTo), StandardCopyOption.REPLACE_EXISTING);
}
但是,这会导致抛出java.nio.file.DirectoryNotEmptyException: /tmp/test/a/b/c 的异常,如果去掉REPLACE_EXISTING 选项,代码会抛出java.nio.file.FileAlreadyExistsException: /tmp/test/a/b/c。
这个question 有一个使用递归函数来解决这个问题的答案。但就我而言,这将涉及进一步的复杂性,因为我什至需要在新位置重新创建子目录结构。
我没有尝试使用commons-io 实用方法org.apache.commons.io.FileUtils#moveDirectoryToDirectory 的选项,因为此代码似乎首先复制文件,然后从原始位置删除它们。在我的情况下,文件很大,因此这不是首选。
如何在不借助复制的情况下实现 java 中的移动功能。单个文件移动是我唯一的选择吗?
TLDR:如何在 java 中模拟 mv 功能,以将带有文件和结构的子目录移动到父目录。
【问题讨论】: