2012-05-28 27 views
6

¿Cuál es la mejor forma de encontrar un directorio con un nombre específico en Java? El directorio que estoy buscando se puede ubicar en el directorio actual o en uno de sus subdirectorios.Búsqueda recursiva de un directorio en Java

+3

[? ¿Qué has intentado] (http://www.whathaveyoutried.com/) O más bien, ¿cuáles son sus teorías basadas en probar los mejores 2 enfoques (encogimientos de hombros) en los que podría pensar? ¿O realmente significa esta pregunta "¿Me puedes dar el código?" –

Respuesta

2

Su solución incluirá el uso de File.listFiles(String)

java.io.File API reference

+0

Gracias Andrew. Tengo un límite de 1.6, pero me olvido de que otros no lo son. – MadcoreTom

+0

* "Tengo una restricción de 1.6" * Como soy yo (excepto cuando vuelvo a sumergirme en el desarrollo 1.5 o posterior). Suerte esos documentos. tienen etiquetas '@ since' y el compilador tiene opciones de compilación cruzada como la 'prueba de ácido' de la compatibilidad de versiones. Me gustaría vincular a los últimos documentos de Java, incluso si las personas mencionaron que estaban desarrollando para Java 1.3. ;) –

0

Divide y vencerás? Un enfoque ingenuo: Por cada directorio, puede iniciar una tarea, se realiza lo siguiente:

  1. lista de todos los directorios
  2. si la lista contiene un directorio coincidente, grabados y salir de la aplicación
  3. iniciar una tarea para cada directorio.
4

Para recorrer el árbol de archivos, se puede utilizar la interfaz FileVisitor. Consulte el tutorial. Por favor, consulte Find sample codes también.

+0

Esta es una solución mejor que @LetcoreTom's #listFiles, ya que le permite finalizar la caminata una vez que se encuentra el archivo. – Kong

0

Algo así como:

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

Como usted ha mencionado recursividad debe atender a este requerimiento

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

¿Tengo la certeza de que este método no es reutilizable (moverlo a alguna clase de utilidad no funcionará), es decir, puede detectar carpetas solo una vez y una vez detectado 'foundFolder' seguirá siendo cierto? –

5

En Java 8 a través del streams API:

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

El #walk es perezoso, entonces cualquier short-circuiting terminal operation optimizará el IO requerido.

+0

Eso compara 'java.nio.Path' de' Path.getFileName' con 'String'. Sugiero 'file.getFileName(). ToFile.getName()' sabiendo que esto parece complicado, quizás caro. –

0

O, usted debe utilizar el concepto de forma recursiva buscar el archivo hasta que se encontró: Aquí está el código:

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