2016-12-08 64 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會接受它作爲正確的答案。 –