首页 > 解决方案 > 即使此目标文件夹已经存在,如何重命名文件夹?

问题描述

即使目录中已经存在同名的目标文件夹,如何重命名文件夹。

我试过renameToclass的方法File,但它不起作用。

例如:

/根

/a
/b

我想用文件夹b的名称重命名文件夹a,实际上文件夹a将被替换,是的,这就是我想要的。

标签: java

解决方案


该解决方案使用 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);
    }
}

推荐阅读