【问题标题】:Recursively create directory递归创建目录
【发布时间】:2011-10-10 02:28:10
【问题描述】:

有人知道如何使用 Java 根据字母 (a-z) 创建 n 级深的子目录吗?

 /a
    /a
        /a
        /b
        /c
        ..
    /b
        /a
        /b
        ..
    ..
        /a
        /b
        /c
        ..

/b
    /a
        /a
        /b
        ..
    /b
        /a
        /b
        ..
    ..
        /a
        /b
        ..
..
    /a
        /a
        /b
        ..
    /b
        /a
        /b
        ..
    ..
        /a
        /b
        ..

【问题讨论】:

    标签: java scala file recursion


    【解决方案1】:

    如果您使用mkdirs()(由@Zhile Zou 建议)并且您的File 对象是文件而不是目录,则可以执行以下操作:

    // Create the directory structure
    file.getParentFile().mkdirs();
    
    // Create the file
    file.createNewFile();
    

    如果您只是简单地执行file.mkdirs(),它将使用文件名创建一个文件夹。

    【讨论】:

      【解决方案2】:

      从 Java 7 开始,首选 java.nio

      import java.nio.file.Files;
      import java.nio.file.Paths;
      
      ...
      
      Files.createDirectories(Paths.get("a/b/c"));
      

      【讨论】:

        【解决方案3】:

        您可以简单地使用java.io.File 类的mkdirs() 方法。

        例子:

        new File("C:\\Directory1\\Directory2").mkdirs();
        

        【讨论】:

        • Files.createDirectories 自 Java 7 起
        【解决方案4】:

        Apache commons 解决了其中的大部分问题。试试 -

        org.apache.commons.io.FileUtils.forceMkdir(目录);

        【讨论】:

        • 我认为这不是手头问题的答案。 如何 这个单一的方法能满足要求吗?问题是关于算法,而不是关于使用什么 API。
        • @jdv 你是如何确定这个问题是关于算法而不是 API 的,我在问题本身中没有看到任何这样的描述。
        • "... 如何..." 但我的评论实际上是关于对某些外部 API 的单个引用并不能作为一个好的 SO 答案。
        • 我在这个问题之前 6 年就回答了这个问题。在不必要地重复之前至少阅读前面的答案。
        【解决方案5】:

        如果您不介意依赖第 3 方 API,Apache Commons IO 包会直接为您完成这项工作。看看FileUtils.ForceMkdir

        Apache 许可证对商业软件开发很友好,即它不需要您像 GPL 那样分发源代码。 (这可能是好事还是坏事,取决于您的观点)。

        【讨论】:

        • 到目前为止,实用目的的最佳答案(即除非它是一个教育练习)。并迫使“构建”问题:即使是最简单的应用程序也需要构建框架,以避免必须管理命令行类路径、jar 的位置等。每个程序员都应该尽早学习 Gradle:基本使用并不困难。然后总是插入(并熟悉)Apache Commons......永远不要重新发明轮子。
        • @mike rodent 错了,从不重新发明轮子是盲目的货物崇拜谬误。这正是导致 NPM left-pad 崩溃的原因。本地 IO java 库处理了很多这方面的问题,达到最终目标所需的少量代码是微不足道的。 davidhaney.io/npm-left-pad-have-we-forgotten-how-to-program
        【解决方案6】:

        Scala 代码:

          def makePathRecursive(path: String) = {
            import java.io.File
            import scala.util.{Try, Failure, Success}
        
            val pathObj = new File(path)
            pathObj.exists match {
              case true => // do nothing
              case false => Try(pathObj.mkdirs) match {
                case Success(_) => // it worked 
                case Failure(e) => // maybe created meanwhile by another thread
                  pathObj.exists match { 
                  case false => throw new Exception(e)
                  case _ =>  
                }
              }
            }
          }
        

        【讨论】:

          【解决方案7】:
              // ensures parent directory is created
              File parentFile = destFile.getParentFile();
              if (parentFile != null && !parentFile.exists()) {
                  parentFile.mkdirs();
              }
          
              // creates destination file
              if (!destFile.exists()) {
                  destFile.createNewFile();
              }
          

          【讨论】:

            【解决方案8】:

            我会写一个小实用方法,它以开始和结束字母以及所需的深度作为参数。该方法递归调用自身直到完成:

             private static void createAlphabetFolders(File parent, int start, int end, int deepth){
            
                if(deepth <= 0){
                  return;
                }
            
                for (int i=start; i < end; i++){
            
                  // create the folder
                  String folderName = "" + ((char) i);
                  File folder = new File(parent, folderName);
                  System.out.println("creating: " + folder.getPath());
                  folder.mkdirs();
            
                  // call recursively
                  createAlphabetFolders(folder, start, end, deepth-1);
                }
              }
            

            人们会这样称呼它:

            createAlphabetFolders(new File("abctest"), 'A', 'E', 5);
            

            【讨论】:

              【解决方案9】:
              public static void main(String[] args) {
                File root = new File("C:\\SO");
                List<String> alphabet = new ArrayList<String>();
                for (int i = 0; i < 26; i++) {
                  alphabet.add(String.valueOf((char)('a' + i)));
                }
              
                final int depth = 3;
                mkDirs(root, alphabet, depth);
              }
              
              public static void mkDirs(File root, List<String> dirs, int depth) {
                if (depth == 0) return;
                for (String s : dirs) {
                  File subdir = new File(root, s);
                  subdir.mkdir();
                  mkDirs(subdir, dirs, depth - 1);
                }
              }
              

              mkDirs 基于给定的Strings 列表递归地创建depth 级目录树,在main 的情况下,该列表由英文字母表中的字符列表组成。

              【讨论】:

                【解决方案10】:

                您可以对字符 a-z 使用三个循环,如下所示:

                import java.io.*;
                
                public class FileCreate {
                
                    public static void main(String[] args) throws Exception {
                        char trunkDirectory = 'a';
                        char branchDirectory = 'a';
                        char leaf = 'a';
                
                        while (trunkDirectory != '{') {
                            while (branchDirectory != '{') {
                                while (leaf != '{') {
                                    System.out.println(trunkDirectory + "/" + branchDirectory + "/" + leaf++);
                                }
                                leaf = 'a';
                                branchDirectory++;
                            }
                            branchDirectory = 'a';
                            trunkDirectory++;
                        }
                
                    }
                }
                

                这只是将路径输出到控制台。您可以使用File#mkdirs() 创建递归目录结构或在嵌套循环的每个中间部分创建目录。我会把它留给你完成。

                【讨论】:

                • 天才!另一个问题:如果我想限制为一组特定的字母怎么办?
                • 如果子集是连续的,则可以轻松更改开始和结束字符。如果它是一组稀疏字符,那么最好创建一个字符数组,例如char[] alphabet = {'a','e','i','o','u'}; 并使用 for(int i=0;i&lt;alphabet.length;i++) { alphabet[i++]; }; 之类的索引循环它
                • 在上一次投票 2 年后又一次无法解释的投票!
                • 还有另一个无法解释的反对票。你们是最棒的!
                猜你喜欢
                • 1970-01-01
                • 2012-06-12
                • 2011-07-28
                • 2016-10-23
                • 1970-01-01
                • 2018-06-30
                • 1970-01-01
                • 2011-09-08
                相关资源
                最近更新 更多