即使目录中已经存在相同名称的目标文件夹,如何重命名文件夹。
我已经尝试过类renameTo
的方法File
,但是它不起作用。
例如:
/ root
/a /b
我想用文件夹b
重命名文件夹a
,实际上文件夹a
将被替换,是的,这就是我想要的。
答案 0 :(得分:0)
您需要先删除“ a”中的所有内容,或将其移动/重命名为其他名称。 您可以使用Apache的递归deleteDictionary函数将其删除。这将获取aFolder中的每个文件并将其删除,然后删除文件夹本身。
FileUtils.deleteDirectory(aFolder);
然后,您可以使用#renameTo
bFolder.renameTo(aFolder);
答案 1 :(得分:0)
在Java 7及更高版本中,您可以将delete
和move
转到Files。
对于您而言,您可以按以下步骤实现:
public class HelloWord {
public static void main(String... args) throws Exception {
Path targetPath = Paths.get(Paths.get("").toAbsolutePath().toString().concat("/src/resources/").concat("a"));
Path thePath = Paths.get(Paths.get("").toAbsolutePath().toString().concat("/src/resources/").concat("b"));
if (Files.exists(targetPath)) { // if the target folder exists, delete it first;
deleteFolder(targetPath);
}
Files.move(thePath, targetPath);
}
private static void deleteFolder(Path path) {
try {
if (Files.isRegularFile(path)) { // delete regular file directly;
Files.delete(path);
return ;
}
try (Stream<Path> paths = Files.walk(path)) {
paths.filter(p -> p.compareTo(path) != 0).forEach(p -> deleteFolder(p)); // delete all the children folders or files;
Files.delete(path); // delete the folder itself;
}
} catch (IOException ignored) {
ignored.printStackTrace();
}
}
}
用于本地测试的文件夹的结构如下:
结果:
答案 2 :(得分:0)
该解决方案使用java.nio.file.Files
类的move
静态方法。
import java.nio.file.*;
import java.io.IOException;
import java.nio.file.attribute.*;
import java.util.*;
import java.util.stream.*;
public class FilesMoveExample {
public static void main (String [] args)
throws IOException {
Path srcePath = Paths.get("C:\\java-nio2\\folder1");
Path targetPath = Paths.get("C:\\java-nio2\\folder2");
Files.move(srcePath, targetPath); // NOTE: Statement A
}
}
假设folder1
是源目录,并且包含多个子目录和文件。
场景1:
照原样使用“声明A”。
源folder1
存在,而目标folder2
不存在。
运行代码时,folder1
重命名为folder2
。 folder1
的文件树已移至folder2
。
场景2:
'声明A'修改为:Files.move(srcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
源folder1
和目标folder2
(空目录)存在。
运行代码时,目标folder2
被folder1
替换(并重命名为folder2
)。 folder1
的文件树已移至folder2
。
场景3:
'声明A'修改为:Files.move(srcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
源folder1
和目标folder2
(非空目录)存在。
运行代码时,抛出DirectoryNotEmptyException
。
在这种情况下3,目标目录需要为空才能使移动成功完成。因此,使用以下方法之一递归删除目标目录,然后执行移动。第一个使用Java 7,第二个使用Java 8:
private static void deleteUsingWalkFileTree(Path start)
throws IOException {
Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException e)
throws IOException {
if (e == null) {
Files.delete(dir);
return FileVisitResult.CONTINUE;
} else {
throw e;
}
}
});
}
private static void deleteUsingWalk(Path start )
throws IOException {
List<Path> files = Files.walk(start)
.sorted(Comparator.reverseOrder())
.collect(Collectors.toList());
for (Path p : files) {
Files.delete(p);
}
}