2008-10-09 11 views
54

मैं जावा में रिक्त रूप से फ़ोल्डर में सभी फ़ाइलों को कैसे सूचीबद्ध कर सकता हूं?जावा में किसी फ़ोल्डर को स्कैन कैसे करें?

+0

ट्री द्वारा आपका क्या मतलब है? कृपया अपने प्रश्न को दोबारा दोहराएं यदि आप किसी फ़ोल्डर (रिकर्सिवली) में सभी फ़ाइलों को सूचीबद्ध करने के लिए एक विधि की तलाश कर रहे हैं। –

+0

@ PeterPerháč यह प्रश्न 4 साल पुराना है .. :) धन्यवाद – Lipis

उत्तर

62

यकीन है कि कैसे आप पेड़ का प्रतिनिधित्व करना चाहते हैं? वैसे भी यहां एक उदाहरण है जो रिकर्सन का उपयोग करके पूरे उप-स्कैन को स्कैन करता है। फ़ाइलों और निर्देशिकाओं का एक जैसे व्यवहार किया जाता है। ध्यान दें कि File.listFiles() गैर-निर्देशिकाओं के लिए शून्य देता है।

public static void main(String[] args) { 
    Collection<File> all = new ArrayList<File>(); 
    addTree(new File("."), all); 
    System.out.println(all); 
} 

static void addTree(File file, Collection<File> all) { 
    File[] children = file.listFiles(); 
    if (children != null) { 
     for (File child : children) { 
      all.add(child); 
      addTree(child, all); 
     } 
    } 
} 

जावा 7 कुछ सुधार प्रदान करता है। उदाहरण के लिए, DirectoryStream एक समय में एक परिणाम प्रदान करता है - कॉलर को अब अभिनय से पहले पूरा करने के लिए सभी I/O संचालन के लिए इंतजार करना पड़ता है। इस वृद्धिशील जीयूआई अद्यतन, जल्दी रद्द, आदि

static void addTree(Path directory, Collection<Path> all) 
     throws IOException { 
    try (DirectoryStream<Path> ds = Files.newDirectoryStream(directory)) { 
     for (Path child : ds) { 
      all.add(child); 
      if (Files.isDirectory(child)) { 
       addTree(child, all); 
      } 
     } 
    } 
} 

ध्यान दें कि खतरनाक अशक्त वापसी मान IOException द्वारा प्रतिस्थापित किया गया है।

जावा 7 भी प्रदान करता है एक tree walker:

static void addTree(Path directory, final Collection<Path> all) 
     throws IOException { 
    Files.walkFileTree(directory, new SimpleFileVisitor<Path>() { 
     @Override 
     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) 
       throws IOException { 
      all.add(file); 
      return FileVisitResult.CONTINUE; 
     } 
    }); 
} 
+0

मुझे याद नहीं है कि मैंने इस कोड को कितनी बार लिखा है। :-P – marcospereira

+3

हाँ यह एक आवर्ती दुःस्वप्न की तरह है ..: पी ~ – volley

+0

मुझे इस जवाब को स्वीकार करना है क्योंकि मैंने पेड़ के लिए पूछा था (मैंने ऑस्कर रेयस का जवाब पहले स्वीकार कर लिया था) .. भले ही रिकर्सन के लिए एक और पंक्ति जोड़ना वह कठिन नहीं था :) – Lipis

21
import java.io.File; 
public class Test { 
    public static void main(String [] args) { 
     File actual = new File("."); 
     for(File f : actual.listFiles()){ 
      System.out.println(f.getName()); 
     } 
    } 
} 

यह अविश्वसनीय रूप से फ़ाइलें और फ़ोल्डर्स प्रदर्शित करता है।

उन्हें ऑर्डर या निर्देशिका प्रिंट आदि

http://java.sun.com/javase/6/docs/api/java/io/File.html

18

चेक बाहर अपाचे कॉमन्स FileUtils (listFiles, iterateFiles, आदि) से बचने के लिए फ़ाइल कक्षा में तरीकों देखें। जो भी आप चाहते हैं और फ़िल्टर भी लागू करने के लिए अच्छी सुविधा विधियां।

http://commons.apache.org/io/api-1.4/org/apache/commons/io/FileUtils.html

+2

किसी समस्या को हल करने के लिए एक गड़बड़ी पुस्तकालय में चूसने जैसा कुछ भी नहीं है, अन्यथा कोड की 10 पंक्तियों के साथ हल किया जा सकता है। – stu

+11

हां, मुझे उन पुस्तकालयों का उपयोग करने से नफरत है जिन्हें परीक्षण किया गया है, उनमें 10 लाइनों से अधिक लंबे समय तक कार्य शामिल हैं। – cmcginty

0

JDK7 में, "अधिक NIO सुविधाओं" एक फ़ाइल पेड़ से अधिक आगंतुक पैटर्न लागू करने के लिए तरीकों या एक निर्देशिका का सिर्फ तत्काल सामग्री होनी चाहिए - करने की कोई जरूरत उन सभी को फिर से शुरू करने से पहले संभावित रूप से बड़ी निर्देशिका में सभी फाइलें पाएं।

+0

लेकिन क्या एनआईओ तेज़ है? – Pacerier

+0

@Pacerier छोटी निर्देशिकाओं के लिए इसे बहुत अंतर नहीं करना चाहिए।मैं अब नौ साल पहले की तुलना में कार्यान्वयन से भी कम परिचित हूं, लेकिन एनआईओ स्ट्रीमिंग * बड़े पैमाने पर * निर्देशिकाओं को एक साथ पढ़ने की तुलना में बेहतर होना चाहिए। ऐसा कहकर, स्मृति अब कई दर्जन बार सस्ता हो जाएगी। –

6

आप जो भी चाहते हैं उसे फ़िल्टर करने के लिए आप FileFilter इंटरफ़ेस का भी उपयोग कर सकते हैं। यह सबसे अच्छा प्रयोग किया जाता है जब आप एक अनाम वर्ग को लागू करने वाली इसे बनाने:

import java.io.File; 
import java.io.FileFilter; 

public class ListFiles { 
    public File[] findDirectories(File root) { 
     return root.listFiles(new FileFilter() { 
      public boolean accept(File f) { 
       return f.isDirectory(); 
      }}); 
    } 

    public File[] findFiles(File root) { 
     return root.listFiles(new FileFilter() { 
      public boolean accept(File f) { 
       return f.isFile(); 
      }}); 
    } 
} 
1

विज्युअलाइजिंग वृक्ष संरचना मेरे लिए सबसे सुविधाजनक तरीका था:

public static void main(String[] args) throws IOException { 
    printTree(0, new File("START/FROM/DIR")); 
} 

static void printTree(int depth, File file) throws IOException { 
    StringBuilder indent = new StringBuilder(); 
    String name = file.getName(); 

    for (int i = 0; i < depth; i++) { 
     indent.append("."); 
    } 

    //Pretty print for directories 
    if (file.isDirectory()) { 
     System.out.println(indent.toString() + "|"); 
     if(isPrintName(name)){ 
      System.out.println(indent.toString() + "*" + file.getName() + "*"); 
     } 
    } 
    //Print file name 
    else if(isPrintName(name)) { 
     System.out.println(indent.toString() + file.getName()); 
    } 
    //Recurse children 
    if (file.isDirectory()) { 
     File[] files = file.listFiles(); 
     for (int i = 0; i < files.length; i++){ 
      printTree(depth + 4, files[i]); 
     } 
    } 
} 

//Exclude some file names 
static boolean isPrintName(String name){ 
    if (name.charAt(0) == '.') { 
     return false; 
    } 
    if (name.contains("svn")) { 
     return false; 
    } 
    //. 
    //. Some more exclusions 
    //. 
    return true; 
} 
2
public static void directory (File dir) { 
    File[] files = dir.listFiles(); 
    for (File file : files) { 
     System.out.println(file.getAbsolutePath()); 
     if (file.listFiles() != null) 
      directory(file);   
    } 
} 

यहाँ निर्देशिका निर्देशिका स्कैन किया जा रहा है । उदाहरण सी: \

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

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