Java – Buscar archivos en un directorio

Se supone que esto es simple, pero no puedo obtenerlo: “escriba un progtwig que busque un nombre de archivo en particular en un directorio determinado”. He encontrado algunos ejemplos de un nombre de archivo y directorio codificados, pero necesito el nombre del directorio y del archivo para que el usuario lo ingrese.

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

puedes probar algo como esto:

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

Aquí está el resultado:

 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 

Esto parece una pregunta de tarea, así que solo te daré algunos consejos:

Intenta dar buenos nombres de variable distintivos. Aquí usaste “fileName” primero para el directorio, y luego para el archivo. Eso es confuso y no lo ayudará a resolver el problema. Usa diferentes nombres para diferentes cosas.

No estás usando Scanner para nada, y no es necesario aquí, deshazte de él.

Además, el método accept debería devolver un valor booleano. En este momento, estás tratando de devolver un String. Boolean significa que debe devolver verdadero o falso. Por ejemplo, return a > 0; puede devolver verdadero o falso, dependiendo del valor de a. Pero return fileName; simplemente devolverá el valor de fileName, que es un String.

Si desea utilizar un filtro de nombre de archivo dynamic, puede implementar FilenameFilter y pasarle al constructor el nombre dynamic.

Por supuesto, esto implica que debe crear instancias cada vez que la clase (sobrecarga), pero funciona

Ejemplo:

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

entonces usas donde necesitas:

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

Con ** Java 8 * hay una alternativa que usa streams y lambdas:

 public static void recursiveFind(Path path, Consumer c) { try (DirectoryStream 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(); } } 

Entonces esto imprimirá todos los archivos recursivamente:

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

Y esto buscará un archivo:

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

He usado un enfoque diferente para buscar un archivo usando la stack … teniendo en cuenta que podría haber carpetas dentro de una carpeta. Aunque no es más rápido que la búsqueda de Windows (y no esperaba eso), definitivamente da el resultado correcto. Por favor modifique el código como lo desee. Este código se creó originalmente para extraer la ruta del archivo de cierta extensión de archivo :). Siéntase libre de optimizar.

 import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * @author Deepankar Sinha */ public class GetList { public List stack; static List lnkFile; static List 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(); 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); }); } } 

El código siguiente ayuda a buscar un archivo en el directorio y abrir su ubicació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); } } } } }