Pregunta GetFiles con múltiples extensiones [duplicado]


Posible duplicado:
¿Puedes llamar a Directory.GetFiles () con múltiples filtros? 

¿Cómo se filtra en más de una extensión?

He intentado:

FileInfo[] Files = dinfo.GetFiles("*.jpg;*.tiff;*.bmp");
FileInfo[] Files = dinfo.GetFiles("*.jpg,*.tiff,*.bmp");

75
2017-08-19 23:55


origen


Respuestas:


¿Por qué no crear un método de extensión? Eso es más legible.

public static IEnumerable<FileInfo> GetFilesByExtensions(this DirectoryInfo dir, params string[] extensions)
{
    if (extensions == null) 
         throw new ArgumentNullException("extensions");
    IEnumerable<FileInfo> files = Enumerable.Empty<FileInfo>();
    foreach(string ext in extensions)
    {
       files = files.Concat(dir.GetFiles(ext));
    }
    return files;
}

EDITAR: una versión más eficiente:

public static IEnumerable<FileInfo> GetFilesByExtensions(this DirectoryInfo dir, params string[] extensions)
{
    if (extensions == null) 
         throw new ArgumentNullException("extensions");
    IEnumerable<FileInfo> files = dir.EnumerateFiles();
    return files.Where(f => extensions.Contains(f.Extension));
}

Uso:

dInfo.GetFilesByExtensions(".jpg",".exe",".gif");

54
2017-08-20 02:15



Puede obtener todos los archivos y luego filtrar la matriz:

public static IEnumerable<FileInfo> GetFilesByExtensions(this DirectoryInfo dirInfo, params string[] extensions)
{
    var allowedExtensions = new HashSet<string>(extensions, StringComparer.OrdinalIgnoreCase);

    return dirInfo.EnumerateFiles()
                  .Where(f => allowedExtensions.Contains(f.Extension));
}

Esto será (marginalmente) más rápido que cualquier otra respuesta aquí.
En .Net 3.5, reemplace EnumerateFiles con GetFiles (que es más lento).

Y úsalo así:

var files = new DirectoryInfo(...).GetFilesByExtensions(".jpg", ".mov", ".gif", ".mp4");

62
2017-11-08 13:53



No puedes hacer eso, porque GetFiles solo acepta un solo patrón de búsqueda. En cambio, puedes llamar GetFiles sin patrón, y filtra los resultados en código:

string[] extensions = new[] { ".jpg", ".tiff", ".bmp" };

FileInfo[] files =
    dinfo.GetFiles()
         .Where(f => extensions.Contains(f.Extension.ToLower()))
         .ToArray();

Si está trabajando con .NET 4, puede usar EnumerateFiles método para evitar cargar todos los objetos FileInfo en la memoria de una vez:

string[] extensions = new[] { ".jpg", ".tiff", ".bmp" };

FileInfo[] files =
    dinfo.EnumerateFiles()
         .Where(f => extensions.Contains(f.Extension.ToLower()))
         .ToArray();

43
2017-08-20 00:12



Puedes usar el método LINQ Union:

dir.GetFiles("*.txt").Union(dir.GetFiles("*.jpg")).ToArray();

11
2017-08-17 18:21



Lo siguiente recupera los archivos jpg, tiff y bmp y le da una IEnumerable<FileInfo> sobre el cual puedes iterar:

var files = dinfo.GetFiles("*.jpg")
    .Concat(dinfo.GetFiles("*.tiff"))
    .Concat(dinfo.GetFiles("*.bmp"));

Si realmente necesitas una matriz, simplemente quédate .ToArray() al final de esto.


5
2017-08-20 00:15



No estoy seguro si eso es posible. MSDN GetFiles referencia dice un patrón de búsqueda, no una lista de patrones de búsqueda.

Podría inclinarme a buscar cada lista por separado y "foreach" en una lista final.


3
2017-08-20 00:08



Sé que hay una forma más elegante de hacerlo y estoy abierto a sugerencias ... esto es lo que hice:

          try
            {


             // Set directory for list to be made of
                DirectoryInfo jpegInfo = new DirectoryInfo(destinationFolder);
                DirectoryInfo jpgInfo = new DirectoryInfo(destinationFolder);
                DirectoryInfo gifInfo = new DirectoryInfo(destinationFolder);
                DirectoryInfo tiffInfo = new DirectoryInfo(destinationFolder);
                DirectoryInfo bmpInfo = new DirectoryInfo(destinationFolder);

                // Set file type
                FileInfo[] Jpegs = jpegInfo.GetFiles("*.jpeg");
                FileInfo[] Jpgs = jpegInfo.GetFiles("*.jpg");
                FileInfo[] Gifs = gifInfo.GetFiles("*.gif");
                FileInfo[] Tiffs = gifInfo.GetFiles("*.tiff");
                FileInfo[] Bmps = gifInfo.GetFiles("*.bmp");

        //  listBox1.Items.Add(@"");  // Hack for the first list item no preview problem
        // Iterate through each file, displaying only the name inside the listbox...
        foreach (FileInfo file in Jpegs)
        {
                listBox1.Items.Add(file.Name);
                Photo curPhoto = new Photo();
                curPhoto.PhotoLocation = file.FullName;
                metaData.AddPhoto(curPhoto);
            }

          foreach (FileInfo file in Jpgs)
          {
              listBox1.Items.Add(file.Name);
                Photo curPhoto = new Photo();
                curPhoto.PhotoLocation = file.FullName;
                metaData.AddPhoto(curPhoto);
            }
          foreach (FileInfo file in Gifs)
          {
              listBox1.Items.Add(file.Name);
              Photo curPhoto = new Photo();
              curPhoto.PhotoLocation = file.FullName;
              metaData.AddPhoto(curPhoto);
          }
          foreach (FileInfo file in Tiffs)
          {
              listBox1.Items.Add(file.Name);
              Photo curPhoto = new Photo();
              curPhoto.PhotoLocation = file.FullName;
              metaData.AddPhoto(curPhoto);
          }
          foreach (FileInfo file in Bmps)
          {
              listBox1.Items.Add(file.Name);
              Photo curPhoto = new Photo();
              curPhoto.PhotoLocation = file.FullName;
              metaData.AddPhoto(curPhoto);
          }

1
2017-08-20 01:37



Estoy usando la siguiente forma para listar archivos.

'////cblSourceFiles is CHECK BOX LIST CONTROL

<_asp:CheckBoxList ID="cblSourceFiles" runat="server" DataTextField="Name" DataValueField="Name" />



        cblSourceFiles.DataSource = (New IO.DirectoryInfo(Path)).EnumerateFiles().Where(AddressOf ValidExtensions)
        cblSourceFiles.DataBind()


    Private Function ValidExtensions(ByVal pFi As System.IO.FileInfo, ByVal pSt As Integer) As Boolean
        Dim mRet As Boolean = False
        For Each mExt As String In ".jpg,.png".Split(",") '//// WebConfig.AllowedFiletypes 
            If pFi.Extension.ToLower = mExt.ToLower Then
                mRet = True
                Exit For
            End If
        Next
        Return mRet
    End Function

-3
2017-12-20 12:36