Рекурсивно создать каталог
Кто-нибудь знает, как использовать 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
..
Ответы
Ответ 1
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 создает дерево каталогов depth
на основе заданного списка String
s, которое в случае main
состоит из списка символов в английском алфавите.
Ответ 2
Вы можете просто использовать метод mkdirs() класса java.io.File
.
Ответ 3
Если вы не против полагаться на сторонний API, пакет Apache Commons IO делает это прямо для вас. Посмотрите FileUtils.ForceMkdir.
Лицензия Apache - это коммерческая разработка программного обеспечения, то есть она не требует, чтобы вы распространяли исходный код так, как это делает GPL. (Что может быть хорошим или плохим, в зависимости от вашей точки зрения).
Ответ 4
Вы можете использовать три петли над символами 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()
для создания рекурсивной структуры каталогов или создания каталогов в каждой промежуточной части вложенного цикла. Я оставлю это для вас, чтобы закончить.
Ответ 5
Я бы написал небольшой полезный метод, который принимает начальную и конечную буквы, а также желаемую глубину в качестве параметров. Этот метод называет себя рекурсивно до завершения:
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);
Ответ 6
Groovy имеет для этого класс FileTreeBuilder. Проблема в том, что его описание слабое, и пример имеет ошибку. Таким образом, я не видел никакого кода, использующего его. Как я нашел, он не будет работать правильно, не устанавливая поле baseDir. Возможно, это решит ваши проблемы.
def tree = new FileTreeBuilder()
tree.src {
main {
groovy {
'Foo.groovy'('println "Hello"')
}
}
test {
groovy {
'FooTest.groovy'('class FooTest extends GroovyTestCase {}')
}
}
}
Это пример из документов. Но он будет работать, только если вы каким-то образом установите baseDir. Например, пройдя через параметр конструктора.
Ответ 7
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 _ =>
}
}
}
}
Ответ 8
// ensures parent directory is created
File parentFile = destFile.getParentFile();
if (parentFile != null && !parentFile.exists()) {
parentFile.mkdirs();
}
// creates destination file
if (!destFile.exists()) {
destFile.createNewFile();
}
Ответ 9
Общее количество сообщений Apache адресовано большинству из них. Попробуйте -
org.apache.commons.io.FileUtils.forceMkdir(каталог);