2012-11-18 103 views
2

我试图获取目录中所有文本文件的名称。如果目录有子目录,那么我也想获得这些文件。我不知道如何让这个过程继续任何数目的子目录。递归查找目录中的所有文本文件

现在下面的代码只是获取当前目录中的所有文本文件和目录中的子目录。对于找到的每个子目录,它还找到任何文本文件和更深的子目录。问题是,如果那些更深的子目录有更深的子目录,那么我没有找到所有的文本文件。这似乎是一个需要递归的问题,因为我不知道这会发生多深。

这里是我到目前为止的代码:

File rootDirectory = new File(rootDir); 
if (rootDirectory.isDirectory()) { 
    System.out.println("Valid directory"); 

    File[] listOfFiles = rootDirectory.listFiles(); 
    for (int i = 0; i < listOfFiles.length; i++) { 
     String iName = listOfFiles[i].getName(); 
     if (listOfFiles[i].isFile()) { 
      if (iName.endsWith(".txt") || iName.endsWith(".TXT")) { 
       System.out.println("File: "+iName); 
      } 
     } 
     if (listOfFiles[i].isDirectory()) { 
      System.out.println("Directory: "+iName); 

      File[] subList = listOfFiles[i].listFiles(); 
      for (int j = 0; j < subList.length; j++) { 
       String jName = subList[j].getName(); 
       if (subList[j].isFile()) { 
        if (jName.endsWith(".txt") || jName.endsWith(".TXT")) { 
         System.out.println("\tFile: "+jName); 
        } 
       } 
       if (subList[j].isDirectory()) { 
        System.out.println("\tDirectory: "+jName); 
       } 
      } 
     } 
    } 
} 
else System.out.println("Invalid directory"); 

编辑:得到它的工作,谢谢奥拉夫Dietsche:

public void findFiles(File root, int depth) { 
    File[] listOfFiles = root.listFiles(); 
    for (int i = 0; i < listOfFiles.length; i++) { 
     String iName = listOfFiles[i].getName(); 
     if (listOfFiles[i].isFile()) { 
      if (iName.endsWith(".txt") || iName.endsWith(".TXT")) { 
       for (int j = 0; j < depth; j++) System.out.print("\t"); 
       System.out.println("File: "+iName); 
      } 
     } 
     else if (listOfFiles[i].isDirectory()) { 
      for (int j = 0; j < depth; j++) System.out.print("\t"); 
      System.out.println("Directory: "+iName); 
      findFiles(listOfFiles[i], depth+1); 
     } 
    } 
} 

回答

8

这是一个recursive problem

public void find_files(File root) 
{ 
    File[] files = root.listFiles(); 
    for (File file : files) { 
     if (file.isFile()) { 
      ... 
     } else if (file.isDirectory()) { 
      find_files(file); 
     } 
    } 
} 
+0

简短而亲切。 +1 –

+0

谢谢,我认为这是我需要的。我会尝试一下 – asimes

1

答案就在你的问题的标签。使用递归。递归包含自己的方法调用。

在这种情况下,该方法应直接在给定目录下打印所有文本文件,并为目录的每个子目录调用自身。

2

使用Java 7中,我实现similiar FUNC的java.nio.file capabilites。并增加了一些测试。

基准我的电脑

  "c:/" "c:/windows" 
file.io 36272ms  14082ms 
file.nio 7167ms  2987ms 

更多的Javadoc中上搜索.TXT时,这是相当强大的API

java.nio.file.filevisitor javadoc

public static void main(String[] args) { 
    long starttime = System.currentTimeMillis(); 
    try { 
     Path startPath = Paths.get("c:/"); 
     Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() { 
      @Override 
      public FileVisitResult preVisitDirectory(Path dir, 
        BasicFileAttributes attrs) { 
       System.out.println("Dir: " + dir.toString()); 
       return FileVisitResult.CONTINUE; 
      } 

      @Override 
      public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { 
       if (file.toString().endsWith(".txt")){ 
        System.out.println(file.toString());  
       } 
       return FileVisitResult.CONTINUE; 
      } 

      @Override 
      public FileVisitResult visitFileFailed(Path file, IOException e) { 
       return FileVisitResult.CONTINUE; 
      } 
     }); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    long completetime = System.currentTimeMillis() - starttime; 
    System.out.println("totaltime=" + completetime); 

} 
+0

我收到了,并在这行代码错误。 BasicFileAttributes attrs它表示BasicFileAttributes无法解析为类型。任何想法如何解决它? – chriss

+0

这应该是一个导入问题,检查你有进口的地方,你实际上使用java7或更高版本 –

相关问题