2009-01-13 9 views
8

Directory.GetFiles (LocalFilePath, searchPattern);Filtrar nombres de archivo: obtener * .abc sin * .abcd, o * .abcde, etc.

Notas de MSDN:

Cuando se utiliza el carácter comodín asterisco en un searchPattern, tales como ".txt", el comportamiento coincidente cuando la extensión es exactamente tres caracteres de longitud es diferente que cuando la extensión es más o menos de tres caracteres de largo. Un SearchPattern con una extensión de archivo de exactamente tres caracteres devuelve archivos que tienen una extensión de tres o más caracteres, donde los primeros tres caracteres coinciden con la extensión de archivo especificada en el searchPattern. Un searchPattern con una extensión de archivo de uno, dos o más de tres caracteres devuelve solo archivos que tienen extensiones de exactamente esa longitud que coinciden con la extensión de archivo especificada en el searchPattern. Al usar el carácter comodín de signo de interrogación, este método devuelve solo los archivos que coinciden con la extensión de archivo especificada. Por ejemplo, dados dos archivos, "archivo1.txt" y "archivo1.txt otro", en un directorio, un patrón de búsqueda de "archivo? .txt" devuelve solo el primer archivo, mientras que un patrón de búsqueda de "archivo .txt" devuelve ambos archivos.

La siguiente lista muestra el comportamiento de diferentes longitudes para el parámetro searchPattern:

  • *.abc devuelve archivos que tienen una extensión de .abc, .abcd, .abcde, .abcdef, y así sucesivamente.

  • *.abcd devuelve solo archivos con una extensión de .abcd.

  • *.abcde devuelve solo los archivos que tienen una extensión de .abcde.

  • *.abcdef devuelve solo archivos con una extensión de .abcdef.

Con el parámetro establecido en searchPattern*.abc, ¿Cómo puedo devolver los archivos que tienen una extensión de .abc, no .abcd, .abcde y así sucesivamente?

Tal vez esta función funcionará:

private bool StriktMatch(string fileExtension, string searchPattern) 
    { 
     bool isStriktMatch = false; 

     string extension = searchPattern.Substring(searchPattern.LastIndexOf('.')); 

     if (String.IsNullOrEmpty(extension)) 
     { 
      isStriktMatch = true; 
     } 
     else if (extension.IndexOfAny(new char[] { '*', '?' }) != -1) 
     { 
      isStriktMatch = true; 
     } 
     else if (String.Compare(fileExtension, extension, true) == 0) 
     { 
      isStriktMatch = true; 
     } 
     else 
     { 
      isStriktMatch = false; 
     } 

     return isStriktMatch; 
    } 

Programa de prueba:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string[] fileNames = Directory.GetFiles("C:\\document", "*.abc"); 

     ArrayList al = new ArrayList(); 

     for (int i = 0; i < fileNames.Length; i++) 
     { 
      FileInfo file = new FileInfo(fileNames[i]); 
      if (StriktMatch(file.Extension, "*.abc")) 
      { 
       al.Add(fileNames[i]); 
      } 
     } 

     fileNames = (String[])al.ToArray(typeof(String)); 

     foreach (string s in fileNames) 
     { 
      Console.WriteLine(s); 
     } 

     Console.Read(); 
    } 

Cualquier otra persona mejor solución?

+0

Tendrás que dar más contexto que eso ... – Eclipse

Respuesta

5

No es un error, un comportamiento perverso pero bien documentado. * .doc coincide * .docx en base a la búsqueda de respaldo 8.3.

Deberá realizar un post-filtrado manual de los resultados para finalizar en doc.

+0

Eliminado mi respuesta, ya que tienes razón. – NotMe

+0

http://msdn.microsoft.com/en-us/library/wz42302f.aspx "Cuando * comodín en un searchPattern, el comportamiento de coincidencia cuando la extensión es exactamente 3 caracteres es diferente que cuando la extensión es más o menos de 3 caracteres ". Cómo irritante. –

+0

bueno saber. ¡Gracias! –

9

La respuesta es que debe hacer el filtrado posterior. GetFiles solo no se puede hacerlo. Aquí hay un ejemplo que post procesará sus resultados. Con esto puedes usar un patrón de búsqueda con GetFiles o no, funcionará de cualquier manera.

List<string> fileNames = new List<string>(); 
// populate all filenames here with a Directory.GetFiles or whatever 

string srcDir = "from"; // set this 
string destDir = "to"; // set this too 

// this filters the names in the list to just those that end with ".doc" 
foreach (var f in fileNames.All(f => f.ToLower().EndsWith(".doc"))) 
{ 
    try 
    { 
     File.Copy(Path.Combine(srcDir, f), Path.Combine(destDir, f)); 
    } 
    catch { ... } 
} 
0

utilizar LINQ ....

string strSomePath = "c:\\SomeFolder"; 
string strSomePattern = "*.abc"; 
string[] filez = Directory.GetFiles(strSomePath, strSomePattern); 

var filtrd = from f in filez 
     where f.EndsWith(strSomePattern) 
     select f; 

foreach (string strSomeFileName in filtrd) 
{ 
    Console.WriteLine(strSomeFileName); 
} 
0

Dado que para "*" .abc GetFiles volverán extensiones de 3 o más, cualquier cosa con una longitud de 3 después de que el "" es una coincidencia exacta, y cualquier cosa más larga no lo es.

string[] fileList = Directory.GetFiles(path, "*.abc"); 

foreach (string file in fileList) 
{ 
    FileInfo fInfo = new FileInfo(file); 

    if (fInfo.Extension.Length == 4) // "." is counted in the length 
    { 
     // exact extension match - process the file... 
    } 
} 

No está seguro de los resultados de los anteriores - mientras que utiliza comparaciones de longitud en lugar de simples manipulaciones de cadenas, nuevo FileInfo() es llamado cada vez alrededor del bucle.

Cuestiones relacionadas