Pertanyaan GetFiles dengan beberapa ekstensi [duplikat]


Kemungkinan Duplikat:
Bisakah Anda memanggil Directory.GetFiles () dengan beberapa filter? 

Bagaimana Anda memfilter pada lebih dari satu ekstensi?

Saya sudah mencoba:

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

75
2017-08-19 23:55


asal


Jawaban:


Mengapa tidak membuat metode ekstensi? Itu lebih mudah dibaca.

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: versi yang lebih efisien:

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

Pemakaian:

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

54
2017-08-20 02:15



Anda bisa mendapatkan setiap file, lalu filter array:

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

Ini akan (sedikit) lebih cepat daripada setiap jawaban lainnya di sini.
Di. Net 3.5, ganti EnumerateFiles dengan GetFiles (yang lebih lambat).

Dan gunakan seperti ini:

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

62
2017-11-08 13:53



Anda tidak bisa melakukan itu, karena GetFiles hanya menerima satu pola pencarian. Sebagai gantinya, Anda bisa menelepon GetFiles tanpa pola, dan filter hasil dalam kode:

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

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

Jika Anda bekerja dengan .NET 4, Anda dapat menggunakan EnumerateFiles metode untuk menghindari memuat semua objek FileInfo dalam memori sekaligus:

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

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

43
2017-08-20 00:12



Anda dapat menggunakan metode LINQ Union:

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

11
2017-08-17 18:21



Berikut ini mengambil file jpg, tiff dan bmp dan memberi Anda IEnumerable<FileInfo> yang bisa Anda ulangi:

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

Jika Anda benar-benar membutuhkan array, cukup tetap .ToArray() di akhir ini.


5
2017-08-20 00:15



Saya tidak yakin apakah itu mungkin. The GetFiles MSDN referensi kata pola pencarian, bukan daftar pola pencarian.

Saya mungkin cenderung untuk mengambil daftar masing-masing secara terpisah dan "foreach" mereka ke dalam daftar akhir.


3
2017-08-20 00:08



Saya tahu ada cara yang lebih elegan untuk melakukan ini dan saya terbuka untuk saran ... inilah yang saya lakukan:

          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



Saya menggunakan cara berikut untuk daftar file.

'////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