Penglobalan file di .NET
Dalam artikel ini, Anda akan mempelajari cara menggunakan globbing file dengan Microsoft.Extensions.FileSystemGlobbing
paket NuGet. Glob adalah istilah yang digunakan untuk menentukan pola untuk mencocokkan nama file dan direktori berdasarkan kartubebas. Globbing adalah tindakan menentukan satu atau beberapa pola glob, dan menghasilkan file dari kecocokan inklusif atau eksklusif.
Pola
Untuk mencocokkan file dalam sistem file berdasarkan pola yang ditentukan pengguna, mulailah dengan membuat Matcher instans objek. Matcher
dapat dibuat tanpa parameter, atau dengan System.StringComparison parameter, yang digunakan secara internal untuk membandingkan pola dengan nama file. Mengekspos Matcher
metode aditif berikut:
Metode AddExclude
dan AddInclude
dapat dipanggil berapa kali, untuk menambahkan berbagai pola nama file untuk mengecualikan atau menyertakan dari hasil. Setelah Anda membuat instans Matcher
dan menambahkan pola, pola tersebut kemudian digunakan untuk mengevaluasi kecocokan dari direktori awal dengan Matcher.Execute metode .
Metode ekstensi
Objek Matcher
memiliki beberapa metode ekstensi.
Beberapa pengecualian
Untuk menambahkan beberapa pola pengecualian, Anda dapat menggunakan:
Matcher matcher = new();
matcher.AddExclude("*.txt");
matcher.AddExclude("*.asciidoc");
matcher.AddExclude("*.md");
Atau, Anda dapat menggunakan MatcherExtensions.AddExcludePatterns(Matcher, IEnumerable<String>[]) untuk menambahkan beberapa pola pengecualian dalam satu panggilan:
Matcher matcher = new();
matcher.AddExcludePatterns(new [] { "*.txt", "*.asciidoc", "*.md" });
Metode ekstensi ini melakukan iterasi atas semua pola yang disediakan yang memanggil AddExclude atas nama Anda.
Beberapa penyertaan
Untuk menambahkan beberapa pola sertakan, Anda dapat menggunakan:
Matcher matcher = new();
matcher.AddInclude("*.txt");
matcher.AddInclude("*.asciidoc");
matcher.AddInclude("*.md");
Atau, Anda dapat menggunakan MatcherExtensions.AddIncludePatterns(Matcher, IEnumerable<String>[]) untuk menambahkan beberapa pola sertakan dalam satu panggilan:
Matcher matcher = new();
matcher.AddIncludePatterns(new[] { "*.txt", "*.asciidoc", "*.md" });
Metode ekstensi ini melakukan iterasi atas semua pola yang disediakan yang memanggil AddInclude atas nama Anda.
Mendapatkan semua file yang cocok
Untuk mendapatkan semua file yang cocok, Anda harus memanggil Matcher.Execute(DirectoryInfoBase) secara langsung atau tidak langsung. Untuk memanggilnya secara langsung, Anda memerlukan direktori pencarian:
Matcher matcher = new();
matcher.AddIncludePatterns(new[] { "*.txt", "*.asciidoc", "*.md" });
string searchDirectory = "../starting-folder/";
PatternMatchingResult result = matcher.Execute(
new DirectoryInfoWrapper(
new DirectoryInfo(searchDirectory)));
// Use result.HasMatches and results.Files.
// The files in the results object are file paths relative to the search directory.
Kode C# sebelumnya:
- Membuat instans Matcher objek.
- AddIncludePatterns(Matcher, IEnumerable<String>[]) Panggilan untuk menambahkan beberapa pola nama file untuk disertakan.
- Mendeklarasikan dan menetapkan nilai direktori pencarian.
- Membuat instans DirectoryInfo dari yang diberikan
searchDirectory
. - DirectoryInfoWrapper Membuat instans dari pembungkusnya
DirectoryInfo
. - Panggilan yang
DirectoryInfoWrapper
diberikan instansExecute
untuk menghasilkan PatternMatchingResult objek.
Catatan
DirectoryInfoWrapper
Jenis didefinisikan dalam Microsoft.Extensions.FileSystemGlobbing.Abstractions
namespace layanan, dan DirectoryInfo
jenisnya ditentukan dalam System.IO
namespace. Untuk menghindari arahan yang tidak perlu using
, Anda dapat menggunakan metode ekstensi yang disediakan.
Ada metode ekstensi lain yang menghasilkan yang mewakili file yang IEnumerable<string>
cocok:
Matcher matcher = new();
matcher.AddIncludePatterns(new[] { "*.txt", "*.asciidoc", "*.md" });
string searchDirectory = "../starting-folder/";
IEnumerable<string> matchingFiles = matcher.GetResultsInFullPath(searchDirectory);
// Use matchingFiles if there are any found.
// The files in this collection are fully qualified file system paths.
Kode C# sebelumnya:
- Membuat instans Matcher objek.
- AddIncludePatterns(Matcher, IEnumerable<String>[]) Panggilan untuk menambahkan beberapa pola nama file untuk disertakan.
- Mendeklarasikan dan menetapkan nilai direktori pencarian.
- Panggilan yang
GetResultsInFullPath
searchDirectory
diberikan nilai untuk menghasilkan semua file yang cocok sebagaiIEnumerable<string>
.
Mencocokkan kelebihan beban
Objek PatternMatchingResult mewakili kumpulan FilePatternMatch instans, dan mengekspos nilai yang boolean
menunjukkan apakah hasilnya cocok—PatternMatchingResult.HasMatches.
Matcher
Dengan instans, Anda dapat memanggil salah satu dari berbagai Match
kelebihan beban untuk mendapatkan hasil pencocokan pola. Metode membatalkan Match
tanggung jawab pada pemanggil untuk menyediakan file atau kumpulan file untuk mengevaluasi kecocokan. Dengan kata lain, pemanggil bertanggung jawab untuk meneruskan file agar cocok.
Penting
Saat menggunakan salah Match
satu kelebihan beban, tidak ada I/O sistem file yang terlibat. Semua globbing file dilakukan dalam memori dengan menyertakan dan mengecualikan matcher
pola instans. Parameter Match
kelebihan beban tidak harus sepenuhnya memenuhi syarat jalur. Direktori saat ini (Directory.GetCurrentDirectory()) digunakan ketika tidak ditentukan.
Untuk mencocokkan satu file:
Matcher matcher = new();
matcher.AddInclude("**/*.md");
PatternMatchingResult result = matcher.Match("file.md");
Kode C# sebelumnya:
- Cocok dengan file apa pun dengan ekstensi file .md , pada kedalaman direktori arbitrer.
- Jika file bernama file.md ada di subdirektori dari direktori saat ini:
result.HasMatches
akan menjaditrue
.- dan
result.Files
akan memiliki satu kecocokan.
Kelebihan beban tambahan Match
berfungsi dengan cara yang sama.
Format pola
Pola yang ditentukan dalam AddExclude
metode dan AddInclude
dapat menggunakan format berikut untuk mencocokkan beberapa file atau direktori.
Direktori atau nama file yang tepat
some-file.txt
path/to/file.txt
Kartubebas
*
dalam nama file dan direktori yang mewakili nol hingga banyak karakter tidak termasuk karakter pemisah.Nilai Deskripsi *.txt
Semua file dengan ekstensi file .txt . *.*
Semua file dengan ekstensi. *
Semua file dalam direktori tingkat atas. .*
Nama file dimulai dengan '.'. *word*
Semua file dengan 'word' dalam nama file. readme.*
Semua file bernama 'readme' dengan ekstensi file apa pun. styles/*.css
Semua file dengan ekstensi '.css' di direktori 'styles/'. scripts/*/*
Semua file dalam 'scripts/' atau satu tingkat subdirektori di bawah 'scripts/'. images*/*
Semua file dalam folder dengan nama atau dimulai dengan 'gambar'. Kedalaman direktori arbitrer (
/**/
).Nilai Deskripsi **/*
Semua file dalam subdirektori apa pun. dir/
Semua file dalam subdirektori apa pun di bawah 'dir/'. dir/**/*
Semua file dalam subdirektori apa pun di bawah 'dir/'. Jalur relatif.
Untuk mencocokkan semua file dalam direktori bernama "bersama" di tingkat saudara dengan direktori dasar yang diberikan kepada Matcher.Execute(DirectoryInfoBase), gunakan
../shared/*
.
Contoh
Pertimbangkan contoh direktori berikut, dan setiap file dalam folder yang sesuai.
📁 parent
│ file.md
│ README.md
│
└───📁 child
│ file.MD
│ index.js
│ more.md
│ sample.mtext
│
├───📁 assets
│ image.png
│ image.svg
│
└───📁 grandchild
file.md
style.css
sub.text
Tip
Beberapa ekstensi file dalam huruf besar, sementara yang lain dalam huruf kecil. Secara default, StringComparer.OrdinalIgnoreCase digunakan. Untuk menentukan perilaku perbandingan string yang berbeda, gunakan Matcher.Matcher(StringComparison) konstruktor.
Untuk mendapatkan semua file markdown, di mana ekstensi file adalah .md atau .mtext, terlepas dari kasus karakter:
Matcher matcher = new();
matcher.AddIncludePatterns(new[] { "**/*.md", "**/*.mtext" });
foreach (string file in matcher.GetResultsInFullPath("parent"))
{
Console.WriteLine(file);
}
Menjalankan aplikasi akan menghasilkan hasil yang mirip dengan yang berikut:
C:\app\parent\file.md
C:\app\parent\README.md
C:\app\parent\child\file.MD
C:\app\parent\child\more.md
C:\app\parent\child\sample.mtext
C:\app\parent\child\grandchild\file.md
Untuk mendapatkan file apa pun dalam direktori aset pada kedalaman arbitrer:
Matcher matcher = new();
matcher.AddInclude("**/assets/**/*");
foreach (string file in matcher.GetResultsInFullPath("parent"))
{
Console.WriteLine(file);
}
Menjalankan aplikasi akan menghasilkan hasil yang mirip dengan yang berikut:
C:\app\parent\child\assets\image.png
C:\app\parent\child\assets\image.svg
Untuk mendapatkan file apa pun di mana nama direktori berisi kata anak pada kedalaman arbitrer, dan ekstensi file bukan .md, .text, atau .mtext:
Matcher matcher = new();
matcher.AddInclude("**/*child/**/*");
matcher.AddExcludePatterns(
new[]
{
"**/*.md", "**/*.text", "**/*.mtext"
});
foreach (string file in matcher.GetResultsInFullPath("parent"))
{
Console.WriteLine(file);
}
Menjalankan aplikasi akan menghasilkan hasil yang mirip dengan yang berikut:
C:\app\parent\child\index.js
C:\app\parent\child\assets\image.png
C:\app\parent\child\assets\image.svg
C:\app\parent\child\grandchild\style.css