递归创建目录

时间:2011-07-21 10:03:40

标签: java scala file recursion

有没有人知道如何使用Java创建基于n级深度字母表(a-z)的子目录?

 /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
        ..

11 个答案:

答案 0 :(得分:111)

您只需使用java.io.File类的mkdirs()方法。

示例:

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

答案 1 :(得分:11)

如果您不介意依赖第三方API,Apache Commons IO包会直接为您执行此操作。看看FileUtils.ForceMkdir

Apache许可证是商业软件开发友好的,即它不要求您像GPL那样分发源代码。 (根据你的观点,这可能是好事还是坏事。)

答案 2 :(得分:2)

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基于depth的给定列表递归创建String级目录树,在main的情况下,该列表由一个列表组成英文字母中的字符。

答案 3 :(得分:2)

从Java 7开始,首选java.nio

import java.nio.file.Files;
import java.nio.file.Paths;

...

Files.createDirectories(Paths.get("a/b/c"));

答案 4 :(得分:0)

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

 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);

答案 5 :(得分:0)

Groovy为它提供了FileTreeBuilder类。问题是,它的描述很弱,例子有错误。所以,我还没有看到任何使用它的代码。正如我所发现的,如果不设置baseDir字段,它将无法正常工作。也许,它会解决你的问题。

 def tree = new FileTreeBuilder()
 tree.src {
    main {
       groovy {
          'Foo.groovy'('println "Hello"')
       }
    }
    test {
       groovy {
          'FooTest.groovy'('class FooTest extends GroovyTestCase {}')
       }
    }
 }

这是docs的例子。但它只有在你设置baseDir时才会起作用。例如,通过构造函数参数。

答案 6 :(得分:0)

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 :(得分:0)

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

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

答案 8 :(得分:0)

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

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

// Create the file
file.createNewFile();

如果您只做file.mkdirs(),它将创建一个带有文件名的文件夹。

答案 9 :(得分:-1)

您可以在字符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()创建递归目录结构,或在嵌套循环的每个中间部分创建目录。我会留给你完成。

答案 10 :(得分:-1)

    // ensures parent directory is created
    File parentFile = destFile.getParentFile();
    if (parentFile != null && !parentFile.exists()) {
        parentFile.mkdirs();
    }

    // creates destination file
    if (!destFile.exists()) {
        destFile.createNewFile();
    }