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:

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 instruktioner 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 gav searchDirectory värdet för att ge alla matchande filer som en IEnumerable<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 vara true.
    • 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

Se även