Globbing plików na platformie .NET

W tym artykule dowiesz się, jak używać funkcji globbingu plików z pakietem Microsoft.Extensions.FileSystemGlobbing NuGet. Symbol wieloznaczny to termin używany do definiowania wzorców pasujących nazw plików i katalogów na podstawie symboli wieloznacznych. Globbing to czynność definiowania jednego lub większej liczby wzorców globu i zwracania plików z dopasowań inkluzywnych lub wyłącznych.

Wzorce

Aby dopasować pliki w systemie plików na podstawie wzorców zdefiniowanych przez użytkownika, zacznij od utworzenia Matcher wystąpienia obiektu. Można Matcher utworzyć wystąpienie elementu bez parametrów lub parametru System.StringComparison , który jest używany wewnętrznie do porównywania wzorców z nazwami plików. Funkcja Matcher uwidacznia następujące metody dodawania:

Obie AddExclude metody i AddInclude mogą być wywoływane dowolną liczbę razy, aby dodać różne wzorce nazw plików do wykluczenia lub uwzględnienia z wyników. Po utworzeniu Matcher wystąpienia i dodaniu wzorców jest on następnie używany do oceny dopasowań z katalogu początkowego za Matcher.Execute pomocą metody .

Metody rozszerzeń

Obiekt Matcher ma kilka metod rozszerzenia.

Wiele wykluczeń

Aby dodać wiele wzorców wykluczania, możesz użyć:

Matcher matcher = new();
matcher.AddExclude("*.txt");
matcher.AddExclude("*.asciidoc");
matcher.AddExclude("*.md");

Alternatywnie możesz użyć polecenia , MatcherExtensions.AddExcludePatterns(Matcher, IEnumerable<String>[]) aby dodać wiele wzorców wykluczania w jednym wywołaniu:

Matcher matcher = new();
matcher.AddExcludePatterns(new [] { "*.txt", "*.asciidoc", "*.md" });

Ta metoda rozszerzenia iteruje wszystkie podane wzorce wywołujące AddExclude w Twoim imieniu.

Wiele dołączań

Aby dodać wiele wzorców dołączania, można użyć:

Matcher matcher = new();
matcher.AddInclude("*.txt");
matcher.AddInclude("*.asciidoc");
matcher.AddInclude("*.md");

Alternatywnie możesz użyć elementu , MatcherExtensions.AddIncludePatterns(Matcher, IEnumerable<String>[]) aby dodać wiele wzorców dołączania w jednym wywołaniu:

Matcher matcher = new();
matcher.AddIncludePatterns(new[] { "*.txt", "*.asciidoc", "*.md" });

Ta metoda rozszerzenia iteruje wszystkie podane wzorce wywołujące AddInclude w Twoim imieniu.

Pobieranie wszystkich pasujących plików

Aby uzyskać wszystkie pasujące pliki, musisz wywołać Matcher.Execute(DirectoryInfoBase) wywołanie bezpośrednio lub pośrednio. Aby wywołać go bezpośrednio, potrzebny jest katalog wyszukiwania:

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.

Poprzedni kod języka C#:

Uwaga

Typ DirectoryInfoWrapper jest zdefiniowany w Microsoft.Extensions.FileSystemGlobbing.Abstractions przestrzeni nazw, a DirectoryInfo typ jest zdefiniowany w System.IO przestrzeni nazw. Aby uniknąć niepotrzebnych instrukcji using , możesz użyć podanych metod rozszerzenia.

Istnieje inna metoda rozszerzenia, która daje reprezentację IEnumerable<string> pasujących plików:

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.

Poprzedni kod języka C#:

  • Tworzy wystąpienie Matcher obiektu.
  • Wywołania AddIncludePatterns(Matcher, IEnumerable<String>[]) w celu dodania kilku wzorców nazw plików do uwzględnienia.
  • Deklaruje i przypisuje wartość katalogu wyszukiwania.
  • Wywołania GetResultsInFullPath podane wartości w searchDirectory celu uzyskania wszystkich pasujących plików jako IEnumerable<string>.

Dopasowywanie przeciążeń

Obiekt PatternMatchingResult reprezentuje kolekcję FilePatternMatch wystąpień i uwidacznia wartość wskazującą boolean , czy wynik ma dopasowania —PatternMatchingResult.HasMatches .

Matcher Wystąpienie umożliwia wywołanie dowolnego z różnych Match przeciążeń, aby uzyskać wynik dopasowania wzorca. Metody Match odwracają odpowiedzialność obiektu wywołującego w celu udostępnienia pliku lub kolekcji plików, w których mają być obliczane dopasowania. Innymi słowy, obiekt wywołujący jest odpowiedzialny za przekazanie pliku do dopasowania.

Ważne

W przypadku korzystania z dowolnego Match przeciążenia nie ma udziału we/wy systemu plików. Wszystkie symbole globbing pliku są wykonywane w pamięci z dołączaniem i wykluczaniem wzorców matcher wystąpienia. Parametry Match przeciążeń nie muszą być w pełni kwalifikowanymi ścieżkami. Bieżący katalog (Directory.GetCurrentDirectory()) jest używany, jeśli nie zostanie określony.

Aby dopasować pojedynczy plik:

Matcher matcher = new();
matcher.AddInclude("**/*.md");

PatternMatchingResult result = matcher.Match("file.md");

Poprzedni kod języka C#:

  • Pasuje do dowolnego pliku z rozszerzeniem pliku md w dowolnej głębokości katalogu.
  • Jeśli plik o nazwie file.md istnieje w podkatalogu z bieżącego katalogu:
    • result.HasMatches będzie to true.
    • i result.Files miałby jeden mecz.

Dodatkowe Match przeciążenia działają w podobny sposób.

Formaty wzorców

Wzorce określone w metodach AddExclude i AddInclude mogą używać następujących formatów, aby dopasować wiele plików lub katalogów.

  • Dokładna nazwa katalogu lub pliku

    • some-file.txt
    • path/to/file.txt
  • Symbole wieloznaczne w nazwach plików i katalogów * , które reprezentują zero do wielu znaków, w tym znaków separatora.

    Wartość Opis
    *.txt Wszystkie pliki z rozszerzeniem .txt pliku.
    *.* Wszystkie pliki z rozszerzeniem.
    * Wszystkie pliki w katalogu najwyższego poziomu.
    .* Nazwy plików rozpoczynające się od '.'.
    *word* Wszystkie pliki z wyrazem w nazwie pliku.
    readme.* Wszystkie pliki o nazwie "readme" z dowolnym rozszerzeniem pliku.
    styles/*.css Wszystkie pliki z rozszerzeniem ".css" w katalogu "styles/".
    scripts/*/* Wszystkie pliki w katalogu "scripts/" lub jeden poziom podkatalogu w obszarze "scripts/".
    images*/* Wszystkie pliki w folderze o nazwie lub zaczynają się od "images".
  • Dowolna głębokość katalogu (/**/).

    Wartość Opis
    **/* Wszystkie pliki w dowolnym podkatalogu.
    dir/ Wszystkie pliki w dowolnym podkatalogu w obszarze "dir/".
    dir/**/* Wszystkie pliki w dowolnym podkatalogu w obszarze "dir/".
  • Ścieżki względne.

    Aby dopasować wszystkie pliki w katalogu o nazwie "shared" na poziomie równorzędnym do katalogu podstawowego podanego w Matcher.Execute(DirectoryInfoBase)programie , użyj polecenia ../shared/*.

Przykłady

Rozważmy następujący przykładowy katalog i każdy plik w odpowiadającym mu folderze.

📁 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

Napiwek

Niektóre rozszerzenia plików znajdują się w wielkiej litery, a inne znajdują się w małych literach. Domyślnie StringComparer.OrdinalIgnoreCase jest używany. Aby określić różne zachowanie porównania ciągów, użyj konstruktora Matcher.Matcher(StringComparison) .

Aby pobrać wszystkie pliki markdown, gdzie rozszerzenie pliku to .md lub .mtext, niezależnie od wielkości liter znaków:

Matcher matcher = new();
matcher.AddIncludePatterns(new[] { "**/*.md", "**/*.mtext" });

foreach (string file in matcher.GetResultsInFullPath("parent"))
{
    Console.WriteLine(file);
}

Uruchomienie aplikacji spowoduje wyświetlenie wyników podobnych do następujących:

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

Aby uzyskać wszystkie pliki w katalogu zasobów w dowolnej głębokości:

Matcher matcher = new();
matcher.AddInclude("**/assets/**/*");

foreach (string file in matcher.GetResultsInFullPath("parent"))
{
    Console.WriteLine(file);
}

Uruchomienie aplikacji spowoduje wyświetlenie wyników podobnych do następujących:

C:\app\parent\child\assets\image.png
C:\app\parent\child\assets\image.svg

Aby uzyskać wszystkie pliki, w których nazwa katalogu zawiera słowo podrzędne w dowolnej głębokości, a rozszerzenia plików nie są .md, .text lub .mtext:

Matcher matcher = new();
matcher.AddInclude("**/*child/**/*");
matcher.AddExcludePatterns(
    new[]
    {
        "**/*.md", "**/*.text", "**/*.mtext"
    });

foreach (string file in matcher.GetResultsInFullPath("parent"))
{
    Console.WriteLine(file);
}

Uruchomienie aplikacji spowoduje wyświetlenie wyników podobnych do następujących:

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

Zobacz też