2013-03-25 115 views
9

這應該很簡單,但我無法得到它 - 「編寫一個程序,搜索給定目錄中的特定文件名。」我發現了一些硬編碼文件名和目錄的例子,但我需要用戶輸入的目錄和文件名。Java - 在目錄中搜索文件

public static void main(String[] args) { 
    String fileName = args[0]; // For the filename declaration 
    String directory;  
    boolean found; 

    File dir = new File(directory); 

    File[] matchingFiles = dir.listFiles(new FilenameFilter() { 
     public boolean accept(File dir, String fileName) { 
      return true; 
     } 
    }); 

} 
+3

這可不行,因爲在「返回文件名」編譯時錯誤。改變它返回true,它將返回所有文件。也請看http://docs.oracle.com/javase/6/docs/api/java/io/File.html#listFiles() – 2013-03-25 20:36:26

+0

您的問題是什麼? – 2013-03-25 20:37:45

回答

23

你可以嘗試這樣的事:

import java.io.*; 
import java.util.*; 
class FindFile 
{ 
    public void findFile(String name,File file) 
    { 
     File[] list = file.listFiles(); 
     if(list!=null) 
     for (File fil : list) 
     { 
      if (fil.isDirectory()) 
      { 
       findFile(name,fil); 
      } 
      else if (name.equalsIgnoreCase(fil.getName())) 
      { 
       System.out.println(fil.getParentFile()); 
      } 
     } 
    } 
    public static void main(String[] args) 
    { 
     FindFile ff = new FindFile(); 
     Scanner scan = new Scanner(System.in); 
     System.out.println("Enter the file to be searched.. "); 
     String name = scan.next(); 
     System.out.println("Enter the directory where to search "); 
     String directory = scan.next(); 
     ff.findFile(name,new File(directory)); 
    } 
} 

這裏是輸出:

J:\Java\misc\load>java FindFile 
Enter the file to be searched.. 
FindFile.java 
Enter the directory where to search 
j:\java\ 
FindFile.java Found in->j:\java\misc\load 
+0

嗨@Vishal,這段代碼不幫我從用戶那裏得到目錄和文件名,這是問題所在。 – 2013-03-25 20:50:11

+0

此代碼給出了文件所在目錄的完整路徑。運行此代碼..在'main'方法中更改find​​File的參數。 – 2013-03-25 20:52:15

+1

@AC查看最新的代碼.. – 2013-03-25 20:57:36

1

這看起來像一個家庭作業的問題,所以我只給你幾個指針:

儘量給好獨特的變量名。在這裏,您先使用「fileName」作爲目錄,然後使用該文件。這是令人困惑的,並不會幫助你解決問題。爲不同的事物使用不同的名字。

您沒有使用Scanner進行任何操作,在此不需要它,請將其除去。

此外,accept方法應該返回一個布爾值。現在,你正試圖返回一個字符串。布爾意味着它應該返回true或false。例如,return a > 0;可能會返回true或false,具體取決於a的值。但return fileName;將只返回fileName的值,這是一個字符串。

1

如果要使用動態文件名過濾器可以實現的FilenameFilter,並通過在構造函數中動態名稱。

當然這一點意味着taht必須實例每次類(開銷),但它的作品

例子:

public class DynamicFileNameFilter implements FilenameFilter { 

    private String comparingname; 

    public DynamicFileNameFilter(String comparingName){ 
     this.comparingname = comparingName; 
    } 

    @Override 
    public boolean accept(File dir, String name) { 
     File file = new File(name); 

     if (name.equals(comparingname) && !file.isDirectory()) 
      return false; 

     else 
      return true; 
    } 

} 

然後你使用,你需要:

FilenameFilter fileNameFilter = new DynamicFileNameFilter("thedynamicNameorpatternYouAreSearchinfor"); 
File[] matchingFiles = dir.listFiles(fileNameFilter); 
+0

你確定'file = new File(name)':這將從一個簡單的名字構建一個文件,它不屬於walked目錄。所以'file.isDirectory()'可能會給你意想不到的結果。我會用'新的文件(名字,目錄)'去 – GPI 2014-08-06 21:07:07

0

我使用了不同的方法來使用堆棧搜索文件。請記住,文件夾內可能存在文件夾。雖然它不比windows搜索快(但我並沒有期待那樣),但它肯定會給出正確的結果。請根據需要修改代碼。此代碼最初是爲了提取某些文件擴展名的文件路徑:)。隨意優化。

import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

/** 
* @author Deepankar Sinha 
*/ 
public class GetList { 
    public List<String> stack; 
    static List<String> lnkFile; 
    static List<String> progName; 

    int index=-1; 
    public static void main(String args[]) throws IOException 
    { 

     //var-- progFile:Location of the file to be search. 
     String progFile="C:\\"; 
     GetList obj=new GetList(); 
     String temp=progFile; 
     int i; 
     while(!"&%@#".equals(temp)) 
     { 
      File dir=new File(temp); 
      String[] directory=dir.list(); 
      if(directory!=null){ 
      for(String name: directory) 
      { 
       if(new File(temp+name).isDirectory()) 
        obj.push(temp+name+"\\"); 
       else 
        if(new File(temp+name).isFile()) 
        { 
         try{ 
          //".exe can be replaced with file name to be searched. Just exclude name.substring()... you know what to do.:) 
         if(".exe".equals(name.substring(name.lastIndexOf('.'), name.length()))) 
         { 
          //obj.addFile(temp+name,name); 
          System.out.println(temp+name); 
         } 
         }catch(StringIndexOutOfBoundsException e) 
         { 
          //debug purpose 
          System.out.println("ERROR******"+temp+name); 
         } 

        } 
      }} 
      temp=obj.pop(); 
     } 
     obj.display(); 

//  for(int i=0;i<directory.length;i++) 
//  System.out.println(directory[i]); 
    } 

    public GetList() { 
     this.stack = new ArrayList<>(); 
     this.lnkFile=new ArrayList<>(); 
     this.progName=new ArrayList<>(); 
    } 
    public void push(String dir) 
    { 
     index++; 
     //System.out.println("PUSH : "+dir+" "+index); 
     this.stack.add(index,dir); 

    } 
    public String pop() 
    { 
     String dir=""; 
     if(index==-1) 
      return "&%@#"; 
     else 
     { 
      dir=this.stack.get(index); 
      //System.out.println("POP : "+dir+" "+index); 
      index--; 

     } 
     return dir; 
    } 

    public void addFile(String name,String name2) 
    { 
     lnkFile.add(name); 
     progName.add(name2); 
    } 

    public void display() 
    { 
     GetList.lnkFile.stream().forEach((lnkFile1) -> { 
      System.out.println(lnkFile1); 
     }); 
    } 

} 
0

下面的代碼有助於搜索文件的目錄,並打開它的位置

import java.io.*; 
import java.util.*; 
import java.awt.Desktop; 
public class Filesearch2 { 


    public static void main(String[] args)throws IOException {   
     Filesearch2 fs = new Filesearch2(); 
     Scanner scan = new Scanner(System.in); 
     System.out.println("Enter the file to be searched.. "); 
     String name = scan.next(); 
     System.out.println("Enter the directory where to search "); 
     String directory = scan.next(); 
     fs.findFile(name,new File(directory)); 
    } 
    public void findFile(String name,File file1)throws IOException 
    {  
     File[] list = file1.listFiles();  
     if(list!=null) 
    {       
     for(File file2 : list) 
     {    
      if (file2.isDirectory()) 
      { 
       findFile(name,file2);    
      } 
      else if (name.equalsIgnoreCase(file2.getName())) 
      {                
       System.out.println("Found");     
       System.out.println("File found at : "+file2.getParentFile()); 
       System.out.println("Path diectory: "+file2.getAbsolutePath()); 
       String p1 = ""+file2.getParentFile(); 
       File f2 = new File(p1); 
       Desktop.getDesktop().open(f2);        
      }      
     }   
     } 
    }   
} 
0

有**的Java 8 *有使用流和lambda表達式替代:

public static void recursiveFind(Path path, Consumer<Path> c) { 
    try (DirectoryStream<Path> newDirectoryStream = Files.newDirectoryStream(path)) { 
    StreamSupport.stream(newDirectoryStream.spliterator(), false) 
       .peek(p -> { 
        c.accept(p); 
        if (p.toFile() 
         .isDirectory()) { 
        recursiveFind(p, c); 
        } 
       }) 
       .collect(Collectors.toList()); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } 
} 

所以這將遞歸地打印所有文件:

recursiveFind(Paths.get("."), System.out::println); 

,這將搜索一個文件:

recursiveFind(Paths.get("."), p -> { 
    if (p.toFile().getName().toString().equals("src")) { 
    System.out.println(p); 
    } 
});