2010-11-10 12 views
5

Estoy trabajando en una aplicación de escritorio para la versión de Windows que utiliza Java. En mi aplicación hay un requisito para buscar todos los archivos .doc y .docx desde MyDocuments/Documents (según O.S.) desde el sistema local y mostrar el nombre y el tamaño del archivo.código de Java para buscar todos los archivos .doc y .docx del sistema local

No estoy obteniendo el camino que me ayudará a enumerar todos los * .doc, * .docx, * .xls, * .xlsx, * .csv, * .txt, * .pdf, * .ppt , * .pptx archivos presentes en Documents/MyDocuments.

Por favor, dame tus sugerencias valiosas o sugiéreme cualquier enlace que me ayude a escribir el código para hacer una búsqueda más rápida y listar con su nombre, tamaño y tipo.

Respuesta

8

Puede utilizar Apache Commons IO, en particular, la clase FileUtils. Eso le daría algo así como:

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

No estoy seguro de que encuentre archivos como "test.DOC" ... – khachik

+0

@khachik Puede ignorar el caso o mayúscula/minúscula según lo necesite. –

0

Es posible que desee buscar en la extracción de texto de MSWord utilizando Apache POI e indexarlos a través de Lucene (para mayor precisión, flexibilidad y velocidad de búsqueda). Nutch y Solr tienen bibliotecas auxiliares para Lucene que puedes usar para acelerar las cosas (es decir, si el núcleo de Lucene no es suficiente).

[actualización] He entendido mal la pregunta original (antes de la actualización). ¿Solo necesita buscar el sistema de archivos usando Java? La API de Java puede hacer eso. Apache también tiene un library (Commons IO) que incluye una utilidad de archivos para listar todos los archivos en un directorio que incluye sus subdirectorios dado un filtro. Lo he usado antes, p. FileUtils.listFiles (dir, filefilter, dirfilter) o FileUtils.listFiles (dir, extensiones [], recursivo). Luego haz tu función de búsqueda de esa lista.

1

Si usted quiere encontrar todos los archivos con formato .doc (x) extensiones, se puede utilizar el método java.io.File.list (filtros de archivos), por ejemplo:

 
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

Compruebe este método.

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

no tengo la reputación suficiente para comentar de modo que presentar esto como una 'respuesta':

@khachik Puede ignoreCase o mayúsculas/minúsculas como sea necesario . - Martijn Verburg Nov 10 '10 a las 12:02

Esto me tomó un poco de averiguar y finalmente encontró la manera de ignorar el caso con esta solución:

Añadir

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

Luego modifique el método searchFilesWithExtensions a return FileUtils.listFiles( directory, filter, DirectoryFileFilter.DIRECTORY);

Cuestiones relacionadas