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#:
- 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.
- Tworzy wystąpienie elementu DirectoryInfo z danego
searchDirectory
elementu . - Tworzy wystąpienie elementu DirectoryInfoWrapper z zawijania
DirectoryInfo
. - Wywołania
Execute
podane w wystąpieniuDirectoryInfoWrapper
w celu uzyskania PatternMatchingResult obiektu.
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 using
dyrektyw, można 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 wsearchDirectory
celu uzyskania wszystkich pasujących plików jakoIEnumerable<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 totrue
.- 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