2011-07-21 344 views
14

有谁知道如何使用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 
     .. 

回答

4
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 recusively创建一个基于的String秒的定列表上depth -level目录树,其中,在main的情况下,由英文字母表中的字符列表组成。

0

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

+0

天才!另一个qn:如果我想限制某个字母集合,该怎么办? – osley

+0

如果子集是连续的,那么可以很容易地改变开始和结束字符。如果它是一组稀疏的字符,那么最好创建一个字符数组,例如'char [] alphabet = {'a','e','i','o','u'};'并循环而不是索引像'for(int i = 0; i andyb

+0

感谢无法解释的downvote 4.5年后 – andyb

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

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

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

+0

迄今为止最好的答案为实际目的(我。即除非这是一项教育活动)。并强制“构建”问题:即使最简单的应用程序也需要构建框架,以避免管理命令行类路径,罐子位置等。每个程序员都应该尽早学习Gradle:基本使用并不困难。然后总是塞进(熟悉)Apache Commons ...从不重新发明轮子。 –

87

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

+6

或从Java 7开始的'Files.createDirectories' –

+1

一个例子可以让答案看起来很好 –

-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(); 
    } 
0

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

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

这是来自文档的示例。但只有当你设置baseDir时,它才会起作用。例如,通过传递构造函数参数。

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 _ => 
     } 
     } 
    } 
    } 
-1

阿帕奇公地解决这些最。尝试 -

org.apache.commons.io.FileUtils.forceMkdir(directory);

+2

我不认为这是对问题的回答。 _这个单一方法是做什么要求的?问题是关于算法,而不是关于使用什么API。 – jdv

+0

@jdv你是怎么确定这个问题是关于算法而不是API的,我在这个问题本身没有看到任何这样的描述。 – KMP

+0

“......如何......”但我的评论真的是关于一个外部API的唯一参考并不能提供一个好的答案。 – jdv