GetFiles avec plusieurs extensions [dupliquer]

possibilité de dupliquer:

vous pouvez appeler L'annuaire?GetFiles () avec plusieurs filtres?

comment filtrer sur plus d'une extension?

j'ai essayé:

FileInfo[] Files = dinfo.GetFiles("*.jpg;*.tiff;*.bmp");
FileInfo[] Files = dinfo.GetFiles("*.jpg,*.tiff,*.bmp");
75
demandé sur Cœur 2010-08-20 03:55:28

8 réponses

Pourquoi ne pas créer une méthode d'extension? C'est plus lisible.

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;
}

EDIT: une version plus efficace:

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));
}

Utilisation:

dInfo.GetFilesByExtensions(".jpg",".exe",".gif");
54
répondu Danny Chen 2011-08-11 09:18:36

vous pouvez obtenir chaque fichier, puis filtrer le tableau:

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));
}

ce sera (marginalement) plus rapide que toutes les autres réponses ici.

Dans .Net 3.5, remplacer EnumerateFiles par GetFiles (qui est plus lent).

et l'utiliser comme ceci:

var files = new DirectoryInfo(...).GetFilesByExtensions(".jpg", ".mov", ".gif", ".mp4");
62
répondu SLaks 2018-01-24 02:33:15

vous ne pouvez pas faire cela, parce que GetFiles n'accepte qu'un seul motif de recherche. Au lieu de cela, vous pouvez appeler GetFiles sans motif, et filtrer les résultats dans le code:

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

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

si vous travaillez avec .NET 4, Vous pouvez utiliser la méthode EnumerateFiles pour éviter de charger tous les objets FileInfo en mémoire en une seule fois:

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

FileInfo[] files =
    dinfo.EnumerateFiles()
         .Where(f => extensions.Contains(f.Extension.ToLower()))
         .ToArray();
45
répondu Thomas Levesque 2010-08-20 01:02:43

vous pouvez utiliser la méthode LINQ Union:

dir.GetFiles("*.txt").Union(dir.GetFiles("*.jpg")).ToArray();
11
répondu Ievgen Naida 2011-08-17 18:21:37

ce qui suit récupère les fichiers jpg, tiff et bmp et vous donne un IEnumerable<FileInfo> sur lequel vous pouvez itérer:

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

si vous avez vraiment besoin d'un tableau, collez simplement .ToArray() à la fin de ceci.

5
répondu Timwi 2010-08-20 00:15:18

Je ne suis pas sûr que ce soit possible. Le MSDN GetFiles référence indique un modèle de recherche, Pas une liste de modèles de recherche.

je pourrais être enclin à aller chercher chaque liste séparément et à les" lire " dans une liste finale.

3
répondu ddm 2010-08-20 00:08:06

je sais qu'il existe une façon plus élégante de le faire et je suis ouvert aux suggestions... c'est ce que j'ai fait:

          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
répondu rd42 2010-08-20 01:37:36

j'utilise la méthode suivante pour lister les fichiers.

'////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
répondu Raoof Arakkal 2015-10-01 08:28:53