2012-05-28 2 views
6

Каков наилучший способ найти каталог с определенным именем в Java? Каталог, который я ищу, можно найти либо в текущем каталоге, либо в одном из его подкаталогов.Рекурсивно искать каталог в Java

+3

[? Что вы пробовали] (http://www.whathaveyoutried.com/) Вернее, каковы ваши теории, основанные на тестировании лучших 2 (пожимающих плечами) подходов, о которых вы могли бы подумать? Или этот вопрос на самом деле означает «Can u giv me the codez?»? –

ответ

2

Ваше решение будет включать в себя использование File.listFiles(String)

java.io.File API reference

+0

Спасибо, Андрей. Я ограничен 1.6, но я забываю, что другие нет. – MadcoreTom

+0

* «Я ограничен 1.6" * Как и я (кроме случаев, когда я опускаюсь обратно на 1.5 dev или выше). К счастью, эти документы. имеют теги '@ since', а компилятор имеет опции кросс-компиляции как« кислотный тест »совместимости версий. Я бы связался с последними документами Java, даже если люди упомянули, что они разрабатывают для Java 1.3. ;) –

0

Разделяй и властвуй? Наивный подход: Для каждого каталога, вы можете запустить задачу, он выполняет следующие действия:

  1. списка всех каталоги
  2. если список содержит соответствующий каталог, гравюры и выйти из приложения
  3. запуска задачи для каждого каталога.
4

Для перемещения по файловому дереву можно использовать интерфейс FileVisitor. См. tutorial. См. Также Find sample codes.

+0

Это лучшее решение, чем @listFiles от MadcoreTom, поскольку оно позволяет вам завершить прогулку после того, как файл найден. – Kong

0

Что-то вроде:

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

Как вы упомянули рекурсии должны удовлетворять этому требованию

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

Я исправлю, что этот метод не может быть повторно использован (перемещение его в какой-то класс утилиты не будет работать), т. Е. Он может обнаруживать папку только один раз и однажды обнаруженный «foundFolder» останется верным? –

5

В Java 8 через streams API:

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

#walk ленив, поэтому любой short-circuiting terminal operation будет оптимизировать требуемое значение.

+0

Что сравнивает 'java.nio.Path' с' Path.getFileName' с 'String'. Я предлагаю 'file.getFileName(). ToFile.getName()' зная, что это кажется сложным, может быть, дорогостоящим. –

0

Или, вы должны использовать понятие рекурсивного поиска файла, пока не найдено: Вот код:

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; 
    } 
} 
Смежные вопросы