2013-03-25 11 views
9

To ma być proste, ale nie mogę go pobrać - "Napisz program, który szuka określonej nazwy pliku w danym katalogu." Znalazłem kilka przykładów zakodowanej na stałe nazwy pliku i katalogu, ale potrzebuję zarówno nazwy katalogów, jak i nazw plików, które wprowadził użytkownik.Java - Wyszukaj pliki w katalogu

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

ten nie może pracować, ponieważ nie jest czas kompilacji błąd w pliku „powrót”. zmień to, aby zwrócić wartość true, a ona zwróci wszystkie pliki. zajrzyj także na http://docs.oracle.com/javase/6/docs/api/java/io/File.html#listFiles() –

+0

Jakie jest twoje pytanie? –

Odpowiedz

23

można spróbować coś takiego:

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

Oto wynik:

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

Hi @Vishal, ten kod nie pomaga mi uzyskać katalogu i nazwy pliku od użytkownika, co stanowi problem. –

+0

Ten kod podaje pełną ścieżkę do katalogu, w którym plik istnieje. Uruchom ten kod ... zmień parametry findFile w metodzie 'main'. –

+1

@AC Zobacz zaktualizowany Kod. –

1

To wygląda jak pytanie zadanie domowe, więc będę po prostu dać Ci kilka wskazówek:

spróbować dać dobre charakterystyczne nazwy zmiennych. Tutaj najpierw użyłeś "fileName" dla katalogu, a potem dla pliku. To jest mylące i nie pomoże ci rozwiązać problemu. Używaj różnych nazw dla różnych rzeczy.

Nie używasz skanera do niczego i nie jest tu potrzebny, pozbądź się go.

Ponadto metoda accept powinna zwracać wartość boolowską. W tej chwili próbujesz zwrócić String. Wartość logiczna oznacza, że ​​powinna zwracać wartość true lub false. Na przykład return a > 0; może zwracać wartość true lub false, w zależności od wartości a. Ale return fileName; po prostu zwróci wartość fileName, która jest łańcuchem.

1

Jeśli chcesz użyć dynamiczny filtr nazw plików można realizować FilenameFilter i przechodzą w konstruktorze nazwa dynamiczna.

Oczywiście oznacza to taht trzeba instancję za każdym razem klasa (overhead), ale działa

Przykład:

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

} 

następnie użyć tam, gdzie trzeba:

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

Czy jesteś pewien co do 'file = new File (name)': stworzy to plik z prostej nazwy, która nie będzie należeć do katalogu walk. Wykonanie 'file.isDirectory()' prawdopodobnie da ci nieoczekiwane wyniki. Poszedłbym z 'nowym plikiem (name, dir)' – GPI

0

Użyłem innego podejścia do wyszukiwania pliku przy użyciu stosu .. pamiętając, że w folderze mogą znajdować się foldery. Choć nie jest szybszy niż przeszukiwanie systemu Windows (i nie spodziewałem się tego), ale zdecydowanie daje prawidłowy wynik. Zmodyfikuj kod, jak chcesz. Ten kod został pierwotnie stworzony w celu wydzielenia ścieżki pliku o określonym rozszerzeniu pliku :). Zapraszam do optymalizacji.

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

następujący kod pomaga wyszukać plik w katalogu i otworzyć jego lokalizacja

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

Z ** Java 8 * istnieje alternatywa, że ​​używają strumieni i lambdy:

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

To spowoduje wydruk wszystkich plików rekurencyjnie:

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

I to będzie szukał pliku:

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