2013-03-25 48 views
9

Điều này được cho là đơn giản, nhưng tôi không thể nhận được nó - "Viết chương trình tìm kiếm tên tệp cụ thể trong thư mục đã cho." Tôi đã tìm thấy một vài ví dụ về tên tệp và thư mục được mã hóa cứng, nhưng tôi cần cả tên tệp và thư mục được nhập bởi người dùng.Java - Tìm kiếm tệp trong thư mục

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

điều này không thể hoạt động vì có lỗi biên dịch trong "tên tệp trả về". thay đổi điều đó để trả về true và nó sẽ trả về tất cả các tệp. cũng xem http://docs.oracle.com/javase/6/docs/api/java/io/File.html#listFiles() –

+0

Câu hỏi của bạn là gì? –

Trả lời

23

bạn có thể thử một cái gì đó như thế này:

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)); 
    } 
} 

Đây là kết quả:

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

Xin chào @Vishal, mã này không giúp tôi nhận được thư mục và tên tệp từ người dùng, đó là vấn đề. –

+0

Mã này cho u đường dẫn đầy đủ của thư mục nơi tệp tồn tại.Run mã này .. thay đổi tham số của hàm findFile trong phương thức 'main'. –

+1

@AC Xem Mã đã cập nhật .. –

1

này trông giống như một câu hỏi bài tập về nhà, vì vậy tôi sẽ chỉ cung cấp cho bạn một vài gợi ý:

Cố gắng đưa ra tên biến đặc biệt tốt. Ở đây bạn đã sử dụng "fileName" đầu tiên cho thư mục, và sau đó cho tệp. Điều đó gây nhầm lẫn và sẽ không giúp bạn giải quyết vấn đề. Sử dụng tên khác nhau cho những thứ khác nhau.

Bạn không sử dụng Máy quét cho bất kỳ thứ gì và không cần thiết ở đây, hãy loại bỏ nó.

Hơn nữa, phương thức chấp nhận phải trả về giá trị boolean. Ngay bây giờ, bạn đang cố gắng trả về một String. Boolean có nghĩa là nó phải trả về true hoặc false. Ví dụ: return a > 0; có thể trả về true hoặc false, tùy thuộc vào giá trị của a. Nhưng return fileName; sẽ chỉ trả về giá trị của fileName, là một String.

1

Nếu bạn muốn sử dụng một bộ lọc tên tập tin năng động bạn có thể thực hiện FilenameFilter và vượt qua trong các nhà xây dựng các tên động.

Tất nhiên điều này ngụ ý taht bạn phải nhanh chóng mỗi khi lớp (overhead), nhưng nó hoạt động

Ví dụ:

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; 
    } 

} 

sau đó bạn sử dụng khi bạn cần:

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

Bạn có chắc chắn về 'file = new File (name)': điều này sẽ xây dựng một tập tin từ một tên đơn giản, mà sẽ không thuộc về thư mục đi. Vì vậy, làm 'file.isDirectory()' có thể sẽ cho bạn kết quả bất ngờ. Tôi đã đi với 'File mới (tên, dir)' – GPI

0

Tôi đã sử dụng một cách tiếp cận khác để tìm kiếm một tệp bằng cách sử dụng ngăn xếp .. lưu ý rằng có thể có các thư mục bên trong một thư mục. Mặc dù nó không nhanh hơn so với cửa sổ tìm kiếm (và tôi đã không hy vọng rằng mặc dù) nhưng nó chắc chắn đưa ra kết quả chính xác. Vui lòng sửa đổi mã như bạn muốn. Mã này ban đầu được thực hiện để trích xuất đường dẫn tệp của phần mở rộng tệp nhất định :). Vui lòng tối ưu hóa.

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

đoạn mã sau giúp để tìm kiếm một tập tin trong thư mục và mở vị trí của nó

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

Với ** Java 8 * có một sự thay thế mà sử dụng con suối và lambdas:

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(); 
    } 
} 

Vì vậy, thao tác này sẽ in tất cả các tệp một cách đệ quy:

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

Và điều này sẽ tìm kiếm một tệp:

recursiveFind(Paths.get("."), p -> { 
    if (p.toFile().getName().toString().equals("src")) { 
    System.out.println(p); 
    } 
}); 
Các vấn đề liên quan