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 ...
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:Filesfile1.txt D:Filesfile2.html D:Filesfile3.xlsx D:Filesfile4.docx D:Filesfile5.csv D:Filesfile6.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:Filesfile1.txt D:Filesfile2.html D:Filesfile3.xlsx D:Filesfile4.docx D:Filesfile5.csv D:Filesfile6.pdf After filter D:Filesfile1.txt D:Filesfile2.html D:Filesfile5.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:Filesfile2.html D:Filesfile3.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:Filesfile1.txt D:Filesfile2.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:Filesfile4.docx D:Filesfile3.xlsx D:Filesfile5.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:Filesfile1.txt D:Filesfile2.html D:Filesfile3.xlsx D:Filesfile4.docx D:Filesfile5.csv D:Filesfile6.pdf After filter D:Filesfile1.txt D:Filesfile2.html D:Filesfile5.csv The second way: D:Filesfile2.html D:Filesfile3.xlsx The third way: D:Filesfile1.txt D:Filesfile2.html The fourth way: D:Filesfile4.docx D:Filesfile3.xlsx D:Filesfile5.csv
Góc Kinh Nghiệm chúc các bạn vui!