Filglädje i .NET
I den här artikeln får du lära dig hur du använder filglädje med Microsoft.Extensions.FileSystemGlobbing
NuGet-paketet. En glob är en term som används för att definiera mönster för matchande fil- och katalognamn baserat på jokertecken. Globbning är att definiera ett eller flera globmönster och ge filer från antingen inkluderande eller exklusiva matchningar.
Mönster
Om du vill matcha filer i filsystemet baserat på användardefinierade mönster börjar du med att instansiera ett Matcher objekt. A Matcher
kan instansieras utan parametrar, eller med en System.StringComparison parameter, som används internt för att jämföra mönster med filnamn. Exponerar Matcher
följande additiva metoder:
Både AddExclude
och AddInclude
metoder kan kallas valfritt antal gånger för att lägga till olika filnamnsmönster för att antingen exkludera eller inkludera från resultat. När du har instansierat ett Matcher
och lagt till mönster används det sedan för att utvärdera matchningar från en startkatalog med Matcher.Execute metoden.
Tilläggsmetoder
Objektet Matcher
har flera tilläggsmetoder.
Flera undantag
Om du vill lägga till flera exkludera mönster kan du använda:
Matcher matcher = new();
matcher.AddExclude("*.txt");
matcher.AddExclude("*.asciidoc");
matcher.AddExclude("*.md");
Du kan också använda MatcherExtensions.AddExcludePatterns(Matcher, IEnumerable<String>[]) för att lägga till flera exkludera mönster i ett enda anrop:
Matcher matcher = new();
matcher.AddExcludePatterns(new [] { "*.txt", "*.asciidoc", "*.md" });
Den här tilläggsmetoden itererar över alla angivna mönster som anropar AddExclude åt dig.
Flera inkluderingar
Om du vill lägga till flera inkluderingsmönster kan du använda:
Matcher matcher = new();
matcher.AddInclude("*.txt");
matcher.AddInclude("*.asciidoc");
matcher.AddInclude("*.md");
Du kan också använda MatcherExtensions.AddIncludePatterns(Matcher, IEnumerable<String>[]) för att lägga till flera inkluderingsmönster i ett enda anrop:
Matcher matcher = new();
matcher.AddIncludePatterns(new[] { "*.txt", "*.asciidoc", "*.md" });
Den här tilläggsmetoden itererar över alla angivna mönster som anropar AddInclude åt dig.
Hämta alla matchande filer
För att hämta alla matchande filer måste du anropa Matcher.Execute(DirectoryInfoBase) antingen direkt eller indirekt. Om du vill anropa den direkt behöver du en sökkatalog:
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.
Föregående C#-kod:
- Instansierar ett Matcher objekt.
- Anrop AddIncludePatterns(Matcher, IEnumerable<String>[]) för att lägga till flera filnamnsmönster som ska inkluderas.
- Deklarerar och tilldelar sökkatalogvärdet.
- Instansierar en DirectoryInfo från den angivna
searchDirectory
. - Instansierar en DirectoryInfoWrapper från den
DirectoryInfo
omsluter. - Anrop
Execute
gav instansenDirectoryInfoWrapper
att ge ett PatternMatchingResult objekt.
Kommentar
Typen DirectoryInfoWrapper
definieras i Microsoft.Extensions.FileSystemGlobbing.Abstractions
namnområdet och DirectoryInfo
typen definieras i System.IO
namnområdet. För att undvika onödiga using
direktiv kan du använda de angivna tilläggsmetoderna.
Det finns en annan tilläggsmetod som ger en IEnumerable<string>
som representerar matchande filer:
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.
Föregående C#-kod:
- Instansierar ett Matcher objekt.
- Anrop AddIncludePatterns(Matcher, IEnumerable<String>[]) för att lägga till flera filnamnsmönster som ska inkluderas.
- Deklarerar och tilldelar sökkatalogvärdet.
- Anrop
GetResultsInFullPath
gavsearchDirectory
värdet för att ge alla matchande filer som enIEnumerable<string>
.
Matcha överlagringar
Objektet PatternMatchingResult representerar en samling FilePatternMatch instanser och visar ett boolean
värde som anger om resultatet matchar –PatternMatchingResult.HasMatches .
Med en Matcher
instans kan du anropa någon av de olika Match
överlagringarna för att få ett mönstermatchningsresultat. Metoderna Match
invertera ansvaret för anroparen att ange en fil eller en samling filer som ska utvärderas för matchningar. Anroparen ansvarar med andra ord för att skicka filen som ska matchas.
Viktigt!
När du använder någon av överlagringarna Match
finns det inget filsystem-I/O inblandat. All filgläddring görs i minnet med inkluderings- och exkluderingsmönstren för instansen matcher
. Parametrarna för överlagringarna Match
behöver inte vara fullständigt kvalificerade sökvägar. Den aktuella katalogen (Directory.GetCurrentDirectory()) används när den inte har angetts.
Så här matchar du en enskild fil:
Matcher matcher = new();
matcher.AddInclude("**/*.md");
PatternMatchingResult result = matcher.Match("file.md");
Föregående C#-kod:
- Matchar alla filer med filnamnstillägget .md på ett godtyckligt katalogdjup.
- Om en fil med namnet file.md finns i en underkatalog från den aktuella katalogen:
result.HasMatches
skulle varatrue
.- och
result.Files
skulle ha en matchning.
De ytterligare Match
överlagringarna fungerar på liknande sätt.
Mönsterformat
De mönster som anges i AddExclude
metoderna och AddInclude
kan använda följande format för att matcha flera filer eller kataloger.
Exakt katalog- eller filnamn
some-file.txt
path/to/file.txt
Jokertecken
*
i fil- och katalognamn som representerar noll till många tecken, inklusive avgränsartecken.Värde beskrivning *.txt
Alla filer med .txt filnamnstillägg. *.*
Alla filer med ett tillägg. *
Alla filer i katalogen på den översta nivån. .*
Filnamn som börjar med .. *word*
Alla filer med ordet i filnamnet. readme.*
Alla filer med namnet "readme" med valfritt filnamnstillägg. styles/*.css
Alla filer med tillägget ".css" i katalogen "styles/". scripts/*/*
Alla filer i "scripts/" eller en nivå av underkatalog under "scripts/". images*/*
Alla filer i en mapp med namn som är eller börjar med "bilder". Godtyckligt katalogdjup (
/**/
).Värde beskrivning **/*
Alla filer i valfri underkatalog. dir/
Alla filer i valfri underkatalog under "dir/". dir/**/*
Alla filer i valfri underkatalog under "dir/". Relativa sökvägar.
Om du vill matcha alla filer i en katalog med namnet "delad" på samma nivå som baskatalogen som ges till Matcher.Execute(DirectoryInfoBase)använder du
../shared/*
.
Exempel
Överväg följande exempelkatalog och varje fil i motsvarande mapp.
📁 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
Dricks
Vissa filnamnstillägg finns i versaler, medan andra är i gemener. Som standard StringComparer.OrdinalIgnoreCase används. Om du vill ange olika beteende för strängjämförelse använder du Matcher.Matcher(StringComparison) konstruktorn.
Om du vill hämta alla markdown-filer, där filnamnstillägget är antingen .md eller .mtext, oavsett teckenfall:
Matcher matcher = new();
matcher.AddIncludePatterns(new[] { "**/*.md", "**/*.mtext" });
foreach (string file in matcher.GetResultsInFullPath("parent"))
{
Console.WriteLine(file);
}
Om du kör programmet skulle resultatet se ut ungefär så här:
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
Så här hämtar du filer i en resurskatalog på godtyckligt djup:
Matcher matcher = new();
matcher.AddInclude("**/assets/**/*");
foreach (string file in matcher.GetResultsInFullPath("parent"))
{
Console.WriteLine(file);
}
Om du kör programmet skulle resultatet se ut ungefär så här:
C:\app\parent\child\assets\image.png
C:\app\parent\child\assets\image.svg
Om du vill hämta filer där katalognamnet innehåller ordet underordnad på ett godtyckligt djup och filnamnstilläggen inte är .md, .text eller .mtext:
Matcher matcher = new();
matcher.AddInclude("**/*child/**/*");
matcher.AddExcludePatterns(
new[]
{
"**/*.md", "**/*.text", "**/*.mtext"
});
foreach (string file in matcher.GetResultsInFullPath("parent"))
{
Console.WriteLine(file);
}
Om du kör programmet skulle resultatet se ut ungefär så här:
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