Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
searchDirectoryelementu . - Tworzy wystąpienie elementu DirectoryInfoWrapper z zawijania
DirectoryInfo. - Wywołania
Executepodane w wystąpieniuDirectoryInfoWrapperw 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
GetResultsInFullPathpodane wartości wsearchDirectorycelu 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.HasMatchesbędzie totrue. - i
result.Filesmiałby jeden mecz.
-
Dodatkowe Match przeciążenia działają w podobny sposób.
Uporządkowana ocena włączenia/wyłączenia
Domyślnie element matcher ocenia najpierw wszystkie wzorce dołączania, a następnie stosuje wszystkie wzorce wykluczania, niezależnie od kolejności, w jakiej zostały dodane. Oznacza to, że nie można ponownie dołączać plików, które zostały wcześniej wykluczone.
Począwszy od wersji 10.0 📦 pakietu Microsoft.Extensions.FileSystemGlobbing, można zdecydować się na uporządkowaną ocenę, gdzie uwzględnienia i wykluczenia są przetwarzane dokładnie w kolejności, w której zostały dodane:
using Microsoft.Extensions.FileSystemGlobbing;
// Preserve the order of patterns when matching.
Matcher matcher = new(preserveFilterOrder: true);
matcher.AddInclude("**/*"); // include everything
matcher.AddExclude("logs/**/*"); // exclude logs
matcher.AddInclude("logs/important/**/*"); // re-include important logs
var result = matcher.Execute(new DirectoryInfoWrapper(new DirectoryInfo(root)));
foreach (var file in result.Files)
{
Console.WriteLine(file.Path);
}
W tym trybie wzorce są stosowane po drugim:
-
**/*dodaje wszystkie pliki. -
logs/**/*filtruje wszystkie elementy w plikulogs/. -
logs/important/**/*przywraca tylko pliki w ramachlogs/important/.
Istniejący kod, który używa domyślnego konstruktora, będzie nadal działać z oryginalnym zachowaniem "najpierw wszystkie włącza, a potem wszystkie wyklucza".
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.txtpath/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 *.txtWszystkie 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/*.cssWszystkie 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