如何在Java中重命名文件夹

4

我的文件夹结构如下所示:

D:
|- Folder1
   |- File1
|- Folder2
   |- File2 

输出:

D:
|- Directory1   <- renamed
   |- File1 
|- Directory2   <- renamed
   |- File2 

问题是如何重命名下一级文件夹?

1
你已经询问了其他关于如何在Java中重命名文件/文件夹的问题,其中还包括一个可行的代码。但是在一个问题(https://stackoverflow.com/q/48320280/8097737)中抛出了`AccessDeniedException`异常。那么这真的是与Java相关的问题吗?您能使用其他工具重命名特定文件夹吗? - user8097737
1
@DineshRavi,你能手动重命名其中一个导致问题的文件吗? - user8097737
@DineshRavi 当您可以手动重命名所有这些文件和文件夹(没有任何警告)时,使用您提供的代码应该是可能的。我猜测:问题不在于代码为什么无法工作,而在于环境如何影响它。这些文件/文件夹是如何创建的?程序是否仍在运行并创建(或处理)这些文件/文件夹?在您的创建新名称的代码中,您使用了 replaceAll,您是否确保不存在已经存在此名称的文件/文件夹。 - user8097737
@devpuh 我找到了解决上述问题的方法。请查看我的回答。 - Dinesh Ravi
@DineshRavi 所以问题是在重命名后两个或更多文件夹共享相同的名称吗?(例如:“Folder1”和“Folder2”都被重命名为“Directory”) - user8097737
显示剩余8条评论
2个回答

15
File dir = new File(dirPath);
if (!dir.isDirectory()) {
  System.err.println("There is no directory @ given path");
} else {
    System.out .println("Enter new name of directory(Only Name and Not Path).");
    String newDirName = scanner.nextLine();
    File newDir = new File(dir.getParent() + "\" + newDirName);
    dir.renameTo(newDir);
}

2
避免使用 System.exit(0); - user8097737
2
如果您需要创建非基于操作系统的路径,而不是使用以下代码:File newDir = new File(dir.getParent() + "" + newDirName);请改用以下代码:File newDir = new File(dir.getParent() + File.separator + newDirName); - Luis Carlos

1
这是我解决问题的方法。
  1. 获取指定深度的目录。
  2. 创建新的带有修改名称的目录。
  3. 使用FileUtils (Apache Commons IO)将文件复制到新文件夹中。
  4. 手动删除所有旧文件夹。

package com.so.practice;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.commons.io.FileUtils;

public class Sof {
    public static void main(String[] args) throws IOException {
        List<File> files = getDirs(new File("path to root folder"), 0); //level 0 is inside parent , level 1, and so on
        System.out.println(files);
        String[] paths = new String[files.size()];

        int i = 0;
        for (File file : files) {
            paths[i++] = file.getAbsolutePath();
        }
        String matchword = "Folder1";

        //File  f = null;
        HashMap<String, String > old_new = new HashMap<>();
        for (int j = 0; j < paths.length; j++) {
            System.out.println(paths[j]);
            String old_path = paths[j];
            String foldername = new File(paths[j]).getName();
            //02_PA__OPCON.MES.GC.Configuration 
            //02_Configuration

            if(old_path.contains(matchword)){
                paths[j] =paths[j].replaceAll(matchword, "Directory");

                old_new.put(old_path, paths[j]);

            }else{
                System.out.println("skipping->"+old_path);
            }
            //f = new File(paths[j]);
            //f.mkdirs();
        }

        for(String key : old_new.keySet()){
            FileUtils.copyDirectory(new File(key), new File(old_new.get(key)));
        }

        //FileUtils.copyDirectory(new File(old_new.get), new File(arg0));
     }

     static List<File> getDirs(File parent, int level){
        List<File> dirs = new ArrayList<File>(); //to store 
        for(File f: parent.listFiles()){
            if(f.isDirectory()) {
                if (level==0) dirs.add(f);
                else 
                    if (level > 0) dirs.addAll(getDirs(f,level-1)); //recursion
            }
        }
        return dirs;
    }
}

2
你知道FileUtils.copyDirectory在目标目录中已经存在同名文件时会覆盖它们吗? - user8097737
@devpuh 谢谢,我不知道那个。 - Dinesh Ravi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接