2012-05-28 41 views
6

Cách tốt nhất để tìm một thư mục có tên cụ thể trong Java là gì? Thư mục mà tôi đang tìm kiếm có thể được đặt trong thư mục hiện tại hoặc một trong các thư mục con của nó.Tìm kiếm đệ quy một thư mục trong Java

+3

[? Bạn đã thử gì] (http://www.whathaveyoutried.com/) Hay đúng hơn, các lý thuyết của bạn dựa trên việc thử nghiệm các phương pháp tốt nhất 2 (nhún vai) mà bạn có thể nghĩ ra là gì? Hay câu hỏi này thực sự có nghĩa là "Bạn có thể đưa tôi mã codez không?"? –

Trả lời

2

giải pháp của bạn sẽ bao gồm việc sử dụng các File.listFiles(String)

java.io.File API reference

+0

Cảm ơn Andrew. Tôi bị hạn chế 1.6, nhưng tôi quên rằng những người khác thì không. – MadcoreTom

+0

* "Tôi bị ràng buộc 1.6" * Tôi cũng vậy (trừ khi tôi quay trở lại 1.5 dev hoặc hơn thế nữa). May mắn những tài liệu đó. có thẻ '@ since' và trình biên dịch có các tùy chọn biên dịch chéo như 'kiểm tra axit' về khả năng tương thích phiên bản. Tôi sẽ liên kết với các tài liệu Java mới nhất ngay cả khi mọi người đề cập đến họ đang phát triển cho Java 1.3. ;) –

0

Divide và chinh phục? Một cách tiếp cận ngây thơ: Đối với mỗi thư mục, bạn có thể bắt đầu một nhiệm vụ, nó như sau:

  1. danh sách tất cả các thư mục
  2. nếu danh sách chứa một thư mục phù hợp, in và thoát khỏi ứng dụng
  3. bắt đầu một nhiệm vụ cho mọi thư mục.
4

Để đi bộ cây tệp, giao diện FileVisitor có thể được sử dụng. Vui lòng xem tutorial. Vui lòng xem số Find sample codes.

+0

Đây là giải pháp tốt hơn so với #listFiles của @ MadcoreTom vì nó cho phép bạn chấm dứt việc đi bộ khi tệp được tìm thấy. – Kong

0

Cái gì như:

public static final File findIt(File rootDir, String fileName) { 
    File[] files = rootDir.listFiles(); 
    List<File> directories = new ArrayList<File>(files.length); 
    for (File file : files) { 
     if (file.getName().equals(fileName)) { 
      return file; 
     } else if (file.isDirectory()) { 
      directories.add(file); 
     } 
    } 

    for (File directory : directories) { 
     File file = findIt(directory); 
     if (file != null) { 
      return file; 
     } 
    } 

    return null; 
} 
2

Như bạn đề cập đệ quy nên phục vụ cho yêu cầu này

import java.io.File; 

public class CheckFile { 

    private static boolean foundFolder = false; 

    public static void main(String[] args) { 
     File dir = new File("currentdirectory"); 
     findDirectory(dir); 
    } 

    private static void findDirectory(File parentDirectory) { 
     if(foundFolder) { 
      return; 
     } 
     File[] files = parentDirectory.listFiles(); 
     for (File file : files) { 
      if (file.isFile()) { 
       continue; 
      } 
      if (file.getName().equals("folderNameToFind")) { 
       foundFolder = true; 
       break; 
      } 
      if(file.isDirectory()) { 
       findDirectory(file); 
      } 
     } 
    } 

} 
+0

Tôi có chính xác rằng phương pháp này không thể tái sử dụng được (chuyển nó sang một lớp tiện ích nào đó không hoạt động) tức là nó có thể phát hiện thư mục chỉ một lần và một lần 'phát hiện' được tìm thấy sẽ vẫn đúng? –

5

Trong Java 8 thông qua streams API:

Optional<Path> hit = Files.walk(myPath) 
    .filter(file -> file.getFileName().equals(myName)) 
    .findAny(); 

CáC#walk là lười biếng, vì vậy bất kỳ short-circuiting terminal operation sẽ tối ưu hóa yêu cầu IO.

+0

So sánh 'java.nio.Path' từ' Path.getFileName' với 'Chuỗi'. Tôi đề nghị 'file.getFileName(). ToFile.getName()' biết rằng điều này có vẻ phức tạp, có thể tốn kém. –

0

Hoặc, bạn nên sử dụng khái niệm đệ quy tìm kiếm tập tin cho đến khi nó tìm thấy: Đây là Code:

String name; //to hold the search file name 

public String listFolder(File dir) { 
    int flag; 
    File[] subDirs = dir.listFiles(new FileFilter() { 
     @Override 
     public boolean accept(File pathname) { 
      return pathname.isDirectory(); 
     } 
    }); 
    System.out.println("File of Directory: " + dir.getAbsolutePath()); 
    flag = Listfile(dir); 
    if (flag == 0) { 
     System.out.println("File Found in THe Directory: " + dir.getAbsolutePath()); 
     Speak("File Found in THe Directory: !!" + dir.getAbsolutePath()); 
     return dir.getAbsolutePath(); 
    } 
    for (File folder : subDirs) { 
     listFolder(folder); 
    } 
    return null; 
} 

private int Listfile(File dir) { 
    boolean ch = false; 
    File[] files = dir.listFiles(); 
    for (File file : files) { 
     Listfile(file); 
     if (file.getName().indexOf(name.toLowerCase()) != -1) {//check all in lower case 
      System.out.println(name + "Found Sucessfully!!"); 
      ch = true; 

     } 
    } 
    if (ch) { 
     return 1; 
    } else { 
     return 0; 
    } 
} 
Các vấn đề liên quan