2016-12-08 47 views
0

我想在我的D:\驱动器上使用JAVA中的静态递归查找文件(“Vodoo.txt”)。我想知道你是否可以帮助我找出我做错了什么。使用静态递归查找文件

我的目标是搜索我的所有文件夹,直到找到“Vodoo.txt”并打印出该文件的路径。

我的代码:

import java.io.*; 
import java.util.*; 

public class FindFile 
{ 
    public static String searchForFile(File currentFolder, String filename) 
    { 
    File root = currentFolder; 
    File[] list = root.listFiles(); 

    if(list != null) 
    { 
     for(File f : list) 
     { 
     if(f.isDirectory()) 
     { 

      File path = f.getAbsoluteFile(); 
      if(f.getName().equals(filename)) 
      { 
      System.out.println(f.getAbsoluteFile()); 
      } 
      //System.out.println(f.getAbsoluteFile()); 
      return searchForFile(path, filename); 
     } 
     } 
    } 

    return "WRONG DIRECTORY"; 
    } 


    public static void main(String[] args) 
    { 
     FindFile ff = new FindFile(); 
     File currentFolder = new File("D:\\2016-2017\\Fall2016"); 
     String fileName = "Vodoo.txt"; 
     System.out.println("Search for Vodoo.txt under " + currentFolder); 
     System.out.println("------------------------------------"); 
     ff.searchForFile(currentFolder, fileName); 
    } 
}  

输出:

下d搜索Vodoo.txt:\ 2016- 2017年\ Fall2016

我的实际文件位置:

d:\ 2016- 2017年\ Fall2016 \ 201_CSCE_Programming \作业5 \ RecursivelyFindFile \ Vodoo.txt

回答

0

在你的方法你只有目录检查。如果它不是一个目录,你什么也不做。

应该更像

if(f.isDirectory()) 
    { 
     File path = f.getAbsoluteFile(); 
     return searchForFile(path, filename); 
    } 

    if(f.getName().equals(filename)) 
    { 
     System.out.println("found " + f.getAbsoluteFile()); 
    } 
0

更优雅的方式是使用SimpleFileVisitor从JDK:通过在用户的每一个方向

(从JavaSE的教程)

import java.io.IOException; 
import java.nio.file.FileSystems; 
import java.nio.file.FileVisitResult; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.PathMatcher; 
import java.nio.file.Paths; 
import java.nio.file.SimpleFileVisitor; 
import java.nio.file.attribute.BasicFileAttributes; 

public class FindProgram { 

    public static void main(String[] args) throws IOException { 
     Path startingDir = Paths.get("D:\\"); 
     String pattern = "Voodoo.txt"; 
     Finder finder = new Finder(pattern); 
     Files.walkFileTree(startingDir, finder); 
     finder.done(); 
    } 

    public static class Finder extends SimpleFileVisitor<Path> { 

     private final PathMatcher matcher; 
     private int numMatches = 0; 

     Finder(String pattern) { 
      matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern); 
     } 

     void find(Path file) { 
      Path name = file.getFileName(); 
      if (name != null && matcher.matches(name)) { 
       numMatches++; 
       System.out.println(file); 
      } 
     } 

     void done() { 
      System.out.println("Matched: " + numMatches); 
     } 

     @Override 
     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { 
      find(file); 
      return FileVisitResult.CONTINUE; 
     } 

     @Override 
     public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { 
      find(dir); 
      return FileVisitResult.CONTINUE; 
     } 

     @Override 
     public FileVisitResult visitFileFailed(Path file, IOException exc) { 
      System.err.println(exc); 
      return FileVisitResult.CONTINUE; 
     } 
    } 
} 

这个程序只是简单地散步指定方向:

Path startingDir = Paths.get("D:\\"); 

它寻找文件适用于指定glob模式:

String pattern = "Voodoo.txt"; 

每个访问的文件名通过以下方法检查和路径文件打印:

void find(Path file) { 
    Path name = file.getFileName(); 
    if (name != null && matcher.matches(name)) { 
     numMatches++; 
     System.out.println(file); 
    } 
} 

之前的节目结束数使用此方法可以打印找到的文件:

void done() { 
    System.out.println("Matched: " + numMatches); 
} 

更多有关glob模式的信息,您可以找到在Java文档中,here

+0

但我猜OP的作业要求他使用递归。不错的解决方案虽然 –

+0

但它不回答他的问题 - 所以谁知道也许OP会接受它作为正确的答案。 –