2013-03-25 15 views
9

Das soll einfach sein, aber ich kann es nicht bekommen - "Schreibe ein Programm, das nach einem bestimmten Dateinamen in einem bestimmten Verzeichnis sucht." Ich habe ein paar Beispiele für einen fest codierten Dateinamen und ein Verzeichnis gefunden, aber ich brauche sowohl das Verzeichnis als auch den Dateinamen, wie er vom Benutzer eingegeben wurde.Java - Suche nach Dateien in einem Verzeichnis

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

dies nicht funktionieren kann, weil es ein Kompilierung Fehler in dem „return Dateinamen“ ist. Ändere das, um wahr zurückzugeben, und es werden alle Dateien zurückgegeben. Sehen Sie auch http://docs.oracle.com/javase/6/docs/api/java/io/File.html#listFiles() –

+0

Was ist Ihre Frage? –

Antwort

23

Sie können so etwas wie dies versuchen:

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

Hier ist die Ausgabe:

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

Hallo @Vishal, dieser Code hilft mir nicht, das Verzeichnis und den Dateinamen vom Benutzer zu bekommen, was das Problem ist. –

+0

Dieser Code gibt Ihnen den vollständigen Pfad des Verzeichnisses, in dem die Datei existiert. Führen Sie diesen Code aus. Ändern Sie die Parameter von findFile in der Methode 'main'. –

+1

@AC Siehe den aktualisierten Code .. –

1

Dieses wie eine Hausaufgaben Frage sieht, also werde ich Ihnen nur ein paar Hinweise geben:

versuchen, gute Unterscheidungsvariablennamen zu geben. Hier haben Sie zuerst "fileName" für das Verzeichnis und dann für die Datei verwendet. Das ist verwirrend und wird Ihnen nicht helfen, das Problem zu lösen. Benutze verschiedene Namen für verschiedene Dinge.

Sie verwenden keinen Scanner für irgendetwas, und es wird hier nicht benötigt, loswerden.

Darüber hinaus sollte die Methode akzeptieren einen booleschen Wert zurückgeben. Jetzt versuchen Sie, eine Zeichenfolge zurückzugeben. Boolean bedeutet, dass es entweder wahr oder falsch zurückgeben soll. Zum Beispiel kann wahr oder falsch zurückgeben, abhängig vom Wert von a. Aber return fileName; wird nur den Wert von fileName zurückgeben, was ein String ist.

1

Wenn Sie einen dynamischen Dateinamen Filter verwenden möchten Sie Filename implementieren können und in den Konstruktor übergeben die dynamischer Name

Natürlich impliziert dies taht Sie jedes Mal, wenn die Klasse (Overhead) instanziieren müssen, aber es funktioniert

Beispiel:

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

} 

dann verwenden Sie, wo Sie brauchen:

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

Sind Sie sicher, 'Datei = neue Datei (Name)': Dies wird eine Datei von einem einfachen Namen, der nicht zum gelaufenen Verzeichnis gehören wird. Wenn Sie 'file.isDirectory()' ausführen, erhalten Sie wahrscheinlich unerwartete Ergebnisse. Ich wäre mit 'new File (name, dir)' gegangen – GPI

0

Ich habe einen anderen Ansatz verwendet, um mit Stack nach einer Datei zu suchen. Dabei ist zu beachten, dass sich Ordner in einem Ordner befinden können. Obwohl es nicht schneller ist als Windows-Suche (und ich habe das nicht erwartet), aber es gibt definitiv das richtige Ergebnis. Bitte ändern Sie den Code wie gewünscht. Dieser Code wurde ursprünglich erstellt, um den Dateipfad bestimmter Dateiendungen zu extrahieren :). Fühlen Sie sich frei zu optimieren.

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

Der folgende Code hilft für eine Datei im Verzeichnis zu suchen und öffnen Sie seine Lage

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

Mit ** Java 8 * gibt es eine Alternative, die Bäche und Lambda-Ausdrücke verwenden:

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

So wird dies alle Dateien rekursiv drucken:

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

Und das für eine Datei suchen:

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