Bagikan melalui


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:

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 GetResultsInFullPathsearchDirectory diberikan nilai untuk menghasilkan semua file yang cocok sebagai IEnumerable<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 menjadi true.
    • 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

Lihat juga