即使此目标文件夹已经存在,如何重命名文件夹?

时间:2018-07-20 01:45:03

标签: java

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

我已经尝试过类renameTo的方法File,但是它不起作用。

例如:

  

/ root

/a
/b

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

3 个答案:

答案 0 :(得分:0)

您需要先删除“ a”中的所有内容,或将其移动/重命名为其他名称。 您可以使用Apache的递归deleteDictionary函数将其删除。这将获取aFolder中的每个文件并将其删除,然后删除文件夹本身。

FileUtils.deleteDirectory(aFolder);

然后,您可以使用#renameTo

bFolder.renameTo(aFolder);

答案 1 :(得分:0)

在Java 7及更高版本中,您可以将deletemove转到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();
        }
    }

}

我的本地考试

用于本地测试的文件夹的结构如下:

enter image description here

结果:

enter image description here

答案 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重命名为folder2folder1的文件树已移至folder2

场景2:
'声明A'修改为:Files.move(srcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);folder1和目标folder2目录)存在。 运行代码时,目标folder2folder1替换(并重命名为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);
    }
}