2009-11-03 29 views
7

Tengo una carpeta con dos archivos:Directory.GetFiles con expresiones regulares como filtro

  • Awesome.File.20091031_123002.txt
  • Awesome.File.Summary.20091031_123152.txt

Además, una aplicación de terceros ocupa de los expedientes de la siguiente manera:

  • Lee un folderPath y una searchPattern de una base de datos
  • Ejecuta Directory.GetFiles(folderPath, searchPattern), procesa los archivos que coinciden con el filtro al por mayor, y luego mueve los archivos a una carpeta de archivo.

Resulta que tengo que mover mis dos archivos a diferentes carpetas de archivo, así que tengo que manejarlos por separado al proporcionar diferentes patrones de búsqueda para seleccionarlos individualmente. Tenga en cuenta que no puedo modificar la aplicación de terceros, pero puedo modificar los destinos de búsqueda y archivo en mi base de datos.

¿Qué searchPattern me permitirá seleccionar Awesome.File.20091031_123002.txt sin incluir Awesome.File.Summary.20091031_123152.txt?

+0

son siempre del formato '' Name.File.date_time.txt' y Name.File.Summary.date_time.txt'? –

Respuesta

8

Awesome.File.????????_??????.txt

El signo de interrogación (?) Actúa como un marcador de posición de carácter.

+0

+1, + respuesta: awesomeness :) – Juliet

5

De acuerdo con la documentation, searchPattern sólo es compatible con el ***** y ? comodines. Debería escribir su propio filtro de expresiones regulares que tome los resultados de Directory.GetFiles y aplique más lógica de filtrado.

6

quería probar mis habilidades LINQ magros aquí ... Estoy seguro de que es una solución más elegante, pero aquí está la mía:

string pattern = ".SUMMARY."; 
string[] awesomeFiles = System.IO.Directory.GetFiles("path\\to\\awesomefiles"); 

     IEnumerable<string> sum_files = from file in awesomeFiles 
             where file.ToUpper().Contains(pattern) 
             select file; 

     IEnumerable<string> other_files = from file in awesomeFiles 
             where !file.ToUpper().Contains(pattern) 
             select file; 

Esto supone que no hay ningún otro archivo en el directorio aparte de los dos, pero puede ajustar el patrón aquí para satisfacer sus necesidades (es decir, agregar "Awesome.File" al inicio del patrón.)

Cuando itere la colección de cada uno, debe obtener lo que necesita.

+0

* sniff * Empecé a responder antes de ver la aceptación. Oh bien. Disfruta si puedes usar :). –

+0

+1 para alegrarte :-) –

9

Si su iban a utilizar LINQ entonces ...

var regexTest = new Func<string, bool>(i => Regex.IsMatch(i, @"Awesome.File.(Summary)?.[\d]+_[\d]+.txt", RegexOptions.Compiled | RegexOptions.IgnoreCase)); 
    var files = Directory.GetFiles(@"c:\path\to\folder").Where(regexTest); 
0

Si no desea utilizar LINQ, aquí está una manera.

Public Sub FileChecker (ByVal como secuencia rutaArchivo)

Dim di As New DirectoryInfo(filePath) 
    Dim _MatchCounter As Integer 
    Dim RegexPattern As String = "^[a-zA-Z_a-zA-Z_a-zA-Z_0-9_0-9_0-9.csv]*$" 
    Dim RegexPatternMatch As New Regex(RegexPattern, RegexOptions.IgnoreCase) 

    For Each matchingFile As FileInfo In di.GetFiles() 

     Dim m As Match = RegexPatternMatch.Match(matchingFile.Name) 

     If (m.Success) Then 
      MessageBox.Show(matchingFile.Name) 
      _MatchCounter += 1 
     End If 

    Next 

End Sub 
Cuestiones relacionadas