2011-07-21 53 views
14

Có ai biết cách sử dụng Java để tạo các thư mục con dựa trên các bảng chữ cái (a-z) có n cấp độ sâu không?Đệ quy tạo thư mục

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

Trả lời

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 tạo ra một cây thư mục depth -level dựa trên một danh sách nhất định String s, trong trường hợp của main, bao gồm một danh sách các ký tự trong bảng chữ cái tiếng Anh.

0

Bạn có thể sử dụng ba vòng trên nhân vật a-z như vậy:

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++; 
     } 

    } 
} 

này chỉ đơn giản là kết quả đầu ra các đường dẫn ra cửa sổ Console. Bạn có thể sử dụng File#mkdirs() để tạo cấu trúc thư mục đệ quy hoặc tạo các thư mục trong mỗi phần trung gian của vòng lặp lồng nhau. Tôi sẽ để lại cho bạn để hoàn thành.

+0

Genius! Một qn nữa: nếu tôi muốn giới hạn một nhóm chữ cái nào đó thì sao? – osley

+0

Nếu tập hợp con liên tiếp thì các ký tự bắt đầu và kết thúc có thể dễ dàng thay đổi. Nếu đó là một tập hợp các ký tự thưa thớt thì có lẽ tốt nhất là nên tạo một mảng ký tự, ví dụ: 'char [] alphabet = {'a', 'e', ​​'i', 'o', 'u'};' và lặp lại thay vào đó bằng một chỉ mục như 'for (int i = 0; i andyb

+0

Cảm ơn bạn đã downvote không giải thích được 4,5 năm sau – andyb

0

Tôi sẽ viết một phương thức tiện ích nhỏ để bắt đầu và ký tự kết thúc cũng như số liệu mong muốn làm thông số. Phương pháp này gọi là bản thân một cách đệ quy cho đến khi thực hiện:

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

Người ta sẽ gọi nó là như thế này:

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

Nếu bạn không ngại dựa vào API của bên thứ ba, gói Apache Commons IO thực hiện điều này trực tiếp cho bạn. Hãy xem FileUtils.ForceMkdir.

Giấy phép Apache là sự phát triển phần mềm thương mại thân thiện, tức là nó không yêu cầu bạn phân phối mã nguồn theo cách GPL thực hiện. (Mà có thể là một điều tốt hay xấu, tùy thuộc vào quan điểm của bạn).

+0

Cho đến nay câu trả lời tốt nhất cho các mục đích thực tế (i.e. trừ khi đó là một bài tập giáo dục). Và lực lượng "xây dựng" vấn đề: ngay cả các ứng dụng đơn giản nhất đòi hỏi một khung xây dựng, để tránh phải quản lý dòng lệnh classpaths, vị trí của lọ, vv Mỗi lập trình viên nên học Gradle sớm: sử dụng cơ bản không phải là khó khăn. Và sau đó luôn luôn bung trong (và làm quen với) Apache Commons ... không bao giờ reinvent bánh xe. –

87

Bạn chỉ cần sử dụng phương thức mkdirs() của lớp java.io.File.

+6

Hoặc 'Files.createDirectories' kể từ Java 7 –

+1

Một ví dụ để đi cùng sẽ làm cho câu trả lời trông tuyệt vời –

-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 có lớp FileTreeBuilder cho nó. Vấn đề là, mô tả của nó yếu và ví dụ có lỗi. Vì vậy, tôi đã không nhìn thấy bất kỳ mã sử dụng nó. Như tôi đã tìm thấy, nó sẽ không hoạt động chính xác nếu không thiết lập trường baseDir. Có lẽ, nó sẽ giải quyết vấn đề của bạn.

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

Đó là ví dụ từ tài liệu. Nhưng nó sẽ chỉ hoạt động nếu bạn đặt baseDir bằng cách nào đó. Ví dụ, bằng cách đi qua tham số hàm tạo.

0

đang 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

Apache commons giải quyết hầu hết trong số này. Hãy thử -

org.apache.commons.io.FileUtils.forceMkdir (thư mục);

+2

Tôi không nghĩ rằng đây là câu trả lời cho câu hỏi trong tầm tay. _How_ Phương thức duy nhất này làm những gì được yêu cầu? Câu hỏi đặt ra là về một thuật toán, không phải về API để sử dụng. – jdv

+0

@jdv làm cách nào bạn xác định rằng câu hỏi này là về thuật toán chứ không phải API, tôi không thấy bất kỳ mô tả nào như vậy trong chính câu hỏi đó. – KMP

+0

"... làm thế nào để ..." nhưng bình luận của tôi thực sự là về một ref duy nhất cho một số API bên ngoài không làm cho một câu trả lời SO tốt. – jdv

Các vấn đề liên quan