2011-07-21 5 views
14

क्या कोई जानता है कि वर्णों (ए-जेड) के आधार पर उप-निर्देशिका बनाने के लिए जावा का उपयोग कैसे किया जाए, जो कि एन स्तर गहरे हैं?रिकर्सलीली निर्देशिका

/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 एक depth स्तर निर्देशिका String रों की दी गई सूची के आधार पर पेड़ बनाता है, जो, 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'}; 'और लूप जो इसके बजाय एक इंडेक्स के साथ' int (int i = 0; i andyb

+0

अप्रत्याशित डाउनवोट के लिए धन्यवाद 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 पर एक नज़र डालें।

अपाचे लाइसेंस वाणिज्यिक सॉफ्टवेयर विकास अनुकूल है, यानी आपको जीपीएल के तरीके से अपना स्रोत कोड वितरित करने की आवश्यकता नहीं है। (जो आपके दृष्टिकोण के आधार पर एक अच्छी या बुरी चीज हो सकती है)।

+0

व्यावहारिक उद्देश्यों के लिए अब तक का सबसे अच्छा जवाब (i।ई। जब तक यह एक शैक्षिक अभ्यास नहीं है)। और "बिल्ड" मुद्दे को मजबूर करता है: यहां तक ​​कि सबसे आसान ऐप को कमांड लाइन क्लासपाथ, जार का स्थान इत्यादि प्रबंधित करने से बचने के लिए एक बिल्ड फ्रेमवर्क की आवश्यकता होती है। प्रत्येक प्रोग्रामर को प्रारंभ में ग्रैडल सीखना चाहिए: बुनियादी उपयोग मुश्किल नहीं है। और फिर हमेशा अपाचे कॉमन्स में (और खुद को परिचित करें) में घुमाएं ... कभी भी पहिया को फिर से न करें। –

87

आप java.io.File कक्षा के mkdirs() विधि का उपयोग कर सकते हैं।

+6

या जावा 7 –

+1

के बाद से 'Files.createDirectories' के साथ जाने के लिए एक उदाहरण ने उत्तर को शानदार लगाना होगा –

-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

ग्रोवी के लिए FileTreeBuilder क्लास है। समस्या यह है कि इसका विवरण कमजोर है और उदाहरण में एक त्रुटि है। तो, मैंने इसका उपयोग करके कोई कोड नहीं देखा है। जैसा कि मैंने पाया है, यह बेसडियर फ़ील्ड को सेट किए बिना सही तरीके से काम नहीं करेगा। शायद, यह आपकी समस्याओं का समाधान करेगा।

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

यह दस्तावेज़ों का उदाहरण है। लेकिन यह केवल तभी काम करेगा यदि आप किसी भी तरह बेसडिर सेट करेंगे। उदाहरण के लिए, कन्स्ट्रक्टर पैरामीटर से गुजरकर।

0

स्काला कोड:

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 (निर्देशिका);

+2

मुझे नहीं लगता कि यह सवाल का जवाब है। _How_ क्या यह एकल विधि अनुरोध किया जाता है? सवाल एल्गोरिदम के बारे में है, इस बारे में नहीं कि एपीआई किस प्रकार उपयोग करे। – jdv

+0

@jdv आपने यह कैसे निर्धारित किया कि यह प्रश्न एल्गोरिदम के बारे में है और एपीआई नहीं है, मुझे प्रश्न में ऐसा कोई विवरण दिखाई नहीं देता है। – KMP

+0

"... कैसे करें ..." लेकिन मेरी टिप्पणी वास्तव में कुछ बाहरी एपीआई के लिए एक ही रेफरी के बारे में है जो एक अच्छा SO उत्तर नहीं देती है। – jdv

संबंधित मुद्दे