2010-11-10 13 views
5

Ich arbeite in einer Desktop-Anwendung für Windows-Version mit Java. In meiner Anwendung besteht die Anforderung, alle .doc- und .docx-Dateien aus den MyDocuments/Documents (nach O.S.) vom lokalen System zu durchsuchen und dort Namen und Dateigröße anzuzeigen.Java-Code zum Suchen aller .doc- und .docx-Dateien vom lokalen System

Ich bekomme nicht den Weg, der mir hilft, alle * .doc, * .docx, * .xls, * .xlsx, * .csv, * .txt, * .pdf, * .ppt aufzulisten , * .pptx-Dateien, die in Documents/MyDocuments vorhanden sind.

Bitte geben Sie mir Ihre wertvollen Vorschläge oder schlagen Sie mir einen Link, der mir beim Schreiben von Code für eine schnellere Suche und Auflistung mit Namen, Größe und Typ hilft.

Antwort

8

Sie können Apache Commons IO verwenden, insbesondere die Klasse FileUtils. Das würde so etwas wie:

import java.io.File; 
import java.util.Collection; 

import org.apache.commons.io.*; 
import org.apache.commons.io.filefilter.*; 

public class SearchDocFiles { 
    public static String[] EXTENSIONS = { "doc", "docx" }; 

    public Collection<File> searchFilesWithExtensions(final File directory, final String[] extensions) { 
     return FileUtils.listFiles(directory, 
       extensions, 
       true); 
    } 

    public Collection<File> searchFilesWithCaseInsensitiveExtensions(final File directory, final String[] extensions) { 
     IOFileFilter fileFilter = new SuffixFileFilter(extensions, IOCase.INSENSITIVE); 
     return FileUtils.listFiles(directory, 
       fileFilter, 
       DirectoryFileFilter.INSTANCE); 
    } 


    public static void main(String... args) { 
     // Case sensitive 
     Collection<File> documents = new SearchDocFiles().searchFilesWithExtensions(
       new File("/tmp"), 
       SearchDocFiles.EXTENSIONS); 
     for (File document: documents) { 
      System.out.println(document.getName() + " - " + document.length()); 
     } 

     // Case insensitive 
     Collection<File> caseInsensitiveDocs = new SearchDocFiles().searchFilesWithCaseInsensitiveExtensions(
       new File("/tmp"), 
       SearchDocFiles.EXTENSIONS); 
     for (File document: caseInsensitiveDocs) { 
      System.out.println(document.getName() + " - " + document.length()); 
     } 
    } 
} 
+0

Ich bin nicht sicher, dass es Dateien wie "test.DOC" finden wird ... – khachik

+0

@ khachik Sie könnenCase oder ignorieren Groß-/Kleinschreibung nach Bedarf. –

0

Möglicherweise möchten Sie MSWord-Text mit Apache POI extrahieren und durch Lucene indexieren (für Genauigkeit, Flexibilität und Suchgeschwindigkeit). Nutch und Solr haben beide Hilfsbibliotheken für Lucene, mit denen Sie die Dinge beschleunigen können (wenn der Lucene-Kern nicht ausreicht).

[Update] Ich habe die ursprüngliche Frage (vor dem Update) missverstanden. Sie müssen nur das Dateisystem mit Java durchsuchen? Java API kann das tun. Apache hat auch eine library (Commons IO), die ein Datei-Dienstprogramm enthält, um alle Dateien in einem Verzeichnis einschließlich seiner Unterverzeichnisse bei einem gegebenen Filter aufzulisten. Ich habe es schon einmal benutzt, z.B. FileUtils.listFiles (dir, filefilter, dirfilter) oder FileUtils.listFiles (dir, extensions [], rekursiv). Dann tun Sie Ihre Suchfunktion von dieser Liste.

1

Wenn Sie alle Dateien mit .doc (x) Erweiterungen finden möchten, können Sie java.io.File.list (Filefilter) Methode verwenden, sagen:

 
public java.util.List mswordFiles(java.io.File dir) { 
    java.util.List res = new java.util.ArrayList(); 
    _mswordFiles(dir, res); 
    return res; 
} 
protected void _mswordFiles(java.io.File dir, java.util.List res) { 
    java.io.File [] files = dir.listFiles(new java.io.FileFilter() { 
     public boolean accept(java.io.File f) { 
      String name = f.getName().toLowerCase(); 
      return !f.isDirectory() && (name.endsWith(".doc") || name.endsWith(".docx")); 
     } 
    }); 
    for(java.io.File f:files) {res.add(f);} 
    java.io.File [] dirs = dir.listFiles(new java.io.FileFilter() { 
     public boolean accept(java.io.File f) { 
      return f.isDirectory(); 
     } 
     }); 
    for(java.io.File d:dirs) {_mswordFiles(d, res);} 
} 

2

Überprüfen Sie diese Methode.

public void getFiles(String path) { 
    File dir = new File(path); 
    String[] children = dir.list(); 
    if (children != null) { 
     for (int i = 0; i < children.length; i++) { 
      // Get filename of file or directory 
      String filename = children[i]; 
      File file = new File(path + File.separator + filename); 
      if (!file.isDirectory()) { 
       if (file.getName().endsWith(".doc") || file.getName().endsWith(".docx")) { 
        System.out.println("File Name " + filename + "(" + file.length()+" bytes)"); 
       } 
      } else { 
       getFiles(path + File.separator + filename); 
      } 
     } 
    } 
} 
1

Ich habe nicht genug Ruf zu kommentieren, so haben dies als eine ‚Antwort‘ einreichen:

@khachik Sie ignoreCase oder Groß-/Kleinschreibung, wie Sie benötigen . - Martijn Verburg 10. November '10 bei 12:02

Das hat mich ein wenig, um herauszufinden, und fand schließlich, wie Fall mit dieser Lösung zu ignorieren:

hinzufügen

public static final IOFileFilter filter = new SuffixFileFilter(EXTENSIONS, IOCase.INSENSITIVE);

Dann ändern searchFilesWithExtensions Methode zu return FileUtils.listFiles( directory, filter, DirectoryFileFilter.DIRECTORY);

Verwandte Themen