有没有人知道如何使用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
..
答案 0 :(得分:111)
答案 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();
}