Dùng nhiều extionsions để filter tập tin

Filter trong bài post Cách lấy tất cả tập tin trong thư mục trong C# còn hạn chế là bởi vì, mỗi lần sử dùng hàm Directory.GetFiles() chúng ta chỉ truyền vô được có một loại extension. Câu hỏi đặt ra là muốn filter với nhiều extensions thì làm sao?

Hôm nay Góc Kinh Nghiệm sẽ giới thiệu một vài cách dùng nhiều extensions để filter tập tin.

Tình huống chúng ta sẽ có một thư mục Files trong ổ D: chứa danh sách 6 tập tin với nhiều loại extension như bên dưới:

D:\Files\file1.txt
D:\Files\file2.html
D:\Files\file3.xlsx
D:\Files\file4.docx
D:\Files\file5.csv
D:\Files\file6.pdf

Bây giờ chúng ta sẽ đi sâu vào từng cách cụ thể như sau:

Cách 1:

        public void GetFilesByFilter1()
        {
            txtInfo.Text = "Before filter" + Environment.NewLine;
            string[] files = Directory.GetFiles(@"D:\Files");
            foreach (string file in files)
            {
                txtInfo.Text += file + Environment.NewLine;
            }

            /* Using LinQ to filter by extention */
            string[] fileExtention = { ".html", ".txt", ".csv" };
            txtInfo.Text += "After filter" + Environment.NewLine;
            var filteredFiles = files.Where(f => fileExtention.Any(e => f.EndsWith(e)));
            foreach (var file in filteredFiles)
            {
                txtInfo.Text += file + Environment.NewLine;
            }
        }

=> Kết quả thu được như sau:

Before filter
D:\Files\file1.txt
D:\Files\file2.html
D:\Files\file3.xlsx
D:\Files\file4.docx
D:\Files\file5.csv
D:\Files\file6.pdf
After filter
D:\Files\file1.txt
D:\Files\file2.html
D:\Files\file5.csv

Cách 2:

        public void GetFilesByFilter2()
        {
            IEnumerable<string> filteredFiles = new List<string>();
            string[] filters = { "*.html", "*.xlsx", "*.xml" };
            foreach (string filter in filters)
            {
                filteredFiles = filteredFiles.Concat(Directory.GetFiles(@"D:\Files", filter).AsEnumerable());
            }

            /* Get Files by filter list */
            foreach (var file in filteredFiles)
            {
                txtInfo.Text += file + Environment.NewLine;
            }

        }

=> Kết quả thu được như sau:

D:\Files\file2.html
D:\Files\file3.xlsx

Cách 3:

        public void GetFilesByFilter3()
        {
            string extension1 = ".html";
            string extension2 = ".txt";
            var filteredFiles = Directory.GetFiles(@"D:\Files").Where(f=>f.Contains(extension1) || f.Contains(extension2));
            foreach (var file in filteredFiles)
            {
                txtInfo.Text += file + Environment.NewLine;
            }
        }

=> Kết quả thu được như sau:

D:\Files\file1.txt
D:\Files\file2.html

Cách 4:

        public void GetFilesByFilter4()
        {
            string filters = "*.docx|*.xlsx|*.csv";
            var filteredFiles = filters.Split('|').SelectMany(filter => Directory.GetFiles(@"D:\Files", filter, SearchOption.AllDirectories)).ToList();
            foreach (var file in filteredFiles)
            {
                txtInfo.Text += file + Environment.NewLine;
            }
        }

=> Kết quả thu được như sau:

D:\Files\file4.docx
D:\Files\file3.xlsx
D:\Files\file5.csv

Code hoàn chỉnh:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WinFormsApp
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();

            txtInfo.Text += "The first way: " + Environment.NewLine;
            GetFilesByFilter1();
            txtInfo.Text += Environment.NewLine + "The second way: " + Environment.NewLine;
            GetFilesByFilter2();
            txtInfo.Text += Environment.NewLine + "The third way: " + Environment.NewLine;
            GetFilesByFilter3();
            txtInfo.Text += Environment.NewLine + "The fourth way: " + Environment.NewLine;
            GetFilesByFilter4();
        }

        public void GetFilesByFilter1()
        {
            txtInfo.Text = "Before filter" + Environment.NewLine;
            string[] files = Directory.GetFiles(@"D:\Files");
            foreach (string file in files)
            {
                txtInfo.Text += file + Environment.NewLine;
            }

            /* Using LinQ to filter by extention */
            string[] fileExtention = { ".html", ".txt", ".csv" };
            txtInfo.Text += "After filter" + Environment.NewLine;
            var filteredFiles = files.Where(f => fileExtention.Any(e => f.EndsWith(e)));
            foreach (var file in filteredFiles)
            {
                txtInfo.Text += file + Environment.NewLine;
            }
        }

        public void GetFilesByFilter2()
        {
            IEnumerable<string> filteredFiles = new List<string>();
            string[] filters = { "*.html", "*.xlsx", "*.xml" };
            foreach (string filter in filters)
            {
                filteredFiles = filteredFiles.Concat(Directory.GetFiles(@"D:\Files", filter).AsEnumerable());
            }

            /* Get Files by filter list */
            foreach (var file in filteredFiles)
            {
                txtInfo.Text += file + Environment.NewLine;
            }

        }

        public void GetFilesByFilter3()
        {
            string extension1 = ".html";
            string extension2 = ".txt";
            var filteredFiles = Directory.GetFiles(@"D:\Files").Where(f=>f.Contains(extension1) || f.Contains(extension2));
            foreach (var file in filteredFiles)
            {
                txtInfo.Text += file + Environment.NewLine;
            }
        }

        public void GetFilesByFilter4()
        {
            string filters = "*.docx|*.xlsx|*.csv";
            var filteredFiles = filters.Split('|').SelectMany(filter => Directory.GetFiles(@"D:\Files", filter, SearchOption.AllDirectories)).ToList();
            foreach (var file in filteredFiles)
            {
                txtInfo.Text += file + Environment.NewLine;
            }
        }
    }
}

=> Chạy chương trình:

Before filter
D:\Files\file1.txt
D:\Files\file2.html
D:\Files\file3.xlsx
D:\Files\file4.docx
D:\Files\file5.csv
D:\Files\file6.pdf
After filter
D:\Files\file1.txt
D:\Files\file2.html
D:\Files\file5.csv

The second way:
D:\Files\file2.html
D:\Files\file3.xlsx

The third way:
D:\Files\file1.txt
D:\Files\file2.html

The fourth way:
D:\Files\file4.docx
D:\Files\file3.xlsx
D:\Files\file5.csv

Góc Kinh Nghiệm chúc các bạn vui!


Leave a Reply

Your email address will not be published. Required fields are marked *