2010-05-28 21 views
7

¿Es posible usar una expresión regular para obtener nombres de archivos para archivos que coincidan con un patrón determinado en un directorio sin tener que recorrer manualmente todos los archivos?Regex para archivos en un directorio

Respuesta

25

Usted podría utilizar File.listFiles(FileFilter):.

public static File[] listFilesMatching(File root, String regex) { 
    if(!root.isDirectory()) { 
     throw new IllegalArgumentException(root+" is no directory."); 
    } 
    final Pattern p = Pattern.compile(regex); // careful: could also throw an exception! 
    return root.listFiles(new FileFilter(){ 
     @Override 
     public boolean accept(File file) { 
      return p.matcher(file.getName()).matches(); 
     } 
    }); 
} 

EDITAR

Por lo tanto, para que coincida con los archivos que se parecen: TXT-20100505-XXXX.trx donde XXXX puede ser cualquier cuatro dígitos sucesivos, hacer algo como esto:

listFilesMatching(new File("/some/path"), "XT-20100505-\\d{4}\\.trx") 
+0

tengo archivos en el formato TXT-20100505-0000.trx donde * 0000 * están cambiando los números. TXT-20100525 - * \. Trx no evalúa. ¿Cómo obtendría esos archivos? – n002213f

+0

¿Escribiste mal 'TXT-201005525 -. * \. Trx'? El patrón que escribió coincidirá con cero o más '-' seguido de' .trx'. – msw

+0

gracias msw, no había escrito mal, mi entendimiento fue obtener todos los archivos con el prefijo 'TXT-20100525' seguido de cualquier caracter y luego' .trx'. ¿Cuál es el significado o la razón para tener el '.' adicional antes de' * \\ ' – n002213f

1

aplicar filtros de archivos (sólo requiere que reemplaza el método

public boolean accept(File f) 

entonces, cada vez que se le solicita la lista de archivos, JVM comparará cada archivo en contra de su método. Regex no puede y no debe ser utilizado como java es un lenguaje multiplataforma y que provocaría consecuencias en diferentes sistemas

+2

i duda la validez de la última frase, ¿Por qué sería eso? – n002213f

+2

Regex es estándar en todas las versiones de Java, independientemente del sistema operativo, no importa si lo usa. –

+0

, por favor dígame ¿cómo distinguiría entre archivos y directorios en Unix y Windows con una sola expresión regular? Entendí que la pregunta era "obtener nombres de archivos para archivos que coincidan con un patrón determinado". Esto me recuerda escribir JavaScript que admite algunos navegadores a la vez ... –

0
package regularexpression; 

import java.io.File; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class RegularFile { 
    public static void main(String[] args) { 
     new RegularFile(); 
    } 

    public RegularFile() { 

     String fileName = null; 
     boolean bName = false; 
     int iCount = 0; 
     File dir = new File("C:/regularfolder"); 
     File[] files = dir.listFiles(); 
     System.out.println("List Of Files ::"); 

     for (File f : files) { 

      fileName = f.getName(); 
      System.out.println(fileName); 

      Pattern uName = Pattern.compile(".*l.zip.*"); 
      Matcher mUname = uName.matcher(fileName); 
      bName = mUname.matches(); 
      if (bName) { 
       iCount++; 

      } 
     } 
     System.out.println("File Count In Folder ::" + iCount); 

    } 
} 
+1

usando este código podemos filtrar los archivos de la carpeta usando patrones y clases de matcher. – hanisa

+0

Creo que también debería escapar del carácter de punto antes del ".zip" a "\\. Zip" – Nap

Cuestiones relacionadas