Bestand globbing in .NET

In dit artikel leert u hoe u bestand globbing gebruikt met het Microsoft.Extensions.FileSystemGlobbing NuGet-pakket. Een glob is een term die wordt gebruikt om patronen te definiëren voor overeenkomende bestands- en mapnamen op basis van jokertekens. Globbing is het definiëren van een of meer globpatronen en het opleveren van bestanden van inclusieve of exclusieve overeenkomsten.

Patronen

Als u bestanden in het bestandssysteem wilt vergelijken op basis van door de gebruiker gedefinieerde patronen, begint u met het instantiëren van een Matcher object. Een Matcher kan worden geïnstantieerd zonder parameters of met een System.StringComparison parameter, die intern wordt gebruikt voor het vergelijken van patronen met bestandsnamen. De Matcher volgende additiefmethoden worden weergegeven:

Beide AddExclude methoden AddInclude kunnen een willekeurig aantal keren worden genoemd, om verschillende bestandsnaampatronen toe te voegen om resultaten uit te sluiten of op te nemen. Zodra u een Matcher instantie hebt geïnstantieerd en patronen hebt toegevoegd, wordt deze gebruikt om overeenkomsten uit een beginmap met de Matcher.Execute methode te evalueren.

Extensiemethoden

Het Matcher object heeft verschillende uitbreidingsmethoden.

Meerdere uitsluitingen

Als u meerdere uitsluitingspatronen wilt toevoegen, kunt u het volgende gebruiken:

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

U kunt ook de optie MatcherExtensions.AddExcludePatterns(Matcher, IEnumerable<String>[]) gebruiken om meerdere uitsluitingspatronen toe te voegen in één aanroep:

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

Deze extensiemethode doorloopt alle opgegeven patronen die namens u worden aangeroepen AddExclude .

Meerdere insluitingen

Als u meerdere include-patronen wilt toevoegen, kunt u het volgende gebruiken:

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

U kunt ook de MatcherExtensions.AddIncludePatterns(Matcher, IEnumerable<String>[]) functie gebruiken om meerdere insluitingspatronen toe te voegen in één aanroep:

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

Deze extensiemethode doorloopt alle opgegeven patronen die namens u worden aangeroepen AddInclude .

Alle overeenkomende bestanden ophalen

Als u alle overeenkomende bestanden wilt ophalen, moet u direct of indirect bellen Matcher.Execute(DirectoryInfoBase) . Als u deze rechtstreeks wilt aanroepen, hebt u een zoekmap nodig:

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.

De voorgaande C#-code:

Notitie

Het DirectoryInfoWrapper type wordt gedefinieerd in de Microsoft.Extensions.FileSystemGlobbing.Abstractions naamruimte en het DirectoryInfo type wordt gedefinieerd in de System.IO naamruimte. Als u onnodige using instructies wilt voorkomen, kunt u de opgegeven extensiemethoden gebruiken.

Er is een andere extensiemethode die een IEnumerable<string> weergave van de overeenkomende bestanden oplevert:

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.

De voorgaande C#-code:

  • Instantieert een Matcher object.
  • Aanroepen AddIncludePatterns(Matcher, IEnumerable<String>[]) om verschillende bestandsnaampatronen toe te voegen die moeten worden opgenomen.
  • Declareert en wijst de zoekmapwaarde toe.
  • Aanroepen GetResultsInFullPath die de searchDirectory waarde hebben gegeven om alle overeenkomende bestanden als een IEnumerable<string>.

Overbelastingen vergelijken

Het PatternMatchingResult object vertegenwoordigt een verzameling FilePatternMatch exemplaren en geeft een boolean waarde weer die aangeeft of het resultaat overeenkomtPatternMatchingResult.HasMatches.

Met een Matcher instantie kunt u een van de verschillende Match overbelastingen aanroepen om een patroonkoppelingsresultaat op te halen. De Match methoden keren de verantwoordelijkheid van de beller om een bestand of een verzameling bestanden op te geven waarin moet worden geëvalueerd voor overeenkomsten. Met andere woorden, de beller is verantwoordelijk voor het doorgeven van het bestand aan overeenkomst op.

Belangrijk

Bij het gebruik van een van de Match overbelastingen is er geen I/O van het bestandssysteem betrokken. Alle bestandsglobbing wordt uitgevoerd in het geheugen met de insluitings- en uitsluitingspatronen van het matcher exemplaar. De parameters van de Match overbelasting hoeven geen volledig gekwalificeerde paden te zijn. De huidige map (Directory.GetCurrentDirectory()) wordt gebruikt wanneer deze niet is opgegeven.

Dit komt overeen met één bestand:

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

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

De voorgaande C#-code:

  • Komt overeen met elk bestand met de bestandsextensie .md , op een willekeurige mapdiepte.
  • Als een bestand met de naam file.md bestaat in een submap uit de huidige map:
    • result.HasMatches zou zijn true.
    • en result.Files zou één match hebben.

De extra Match overbelastingen werken op vergelijkbare manieren.

Patroonindelingen

De patronen die zijn opgegeven in de AddExclude en AddInclude methoden kunnen de volgende indelingen gebruiken om meerdere bestanden of mappen te vinden.

  • Exacte map of bestandsnaam

    • some-file.txt
    • path/to/file.txt
  • Jokertekens * in bestands- en mapnamen die nul tot veel tekens vertegenwoordigen, met inbegrip van scheidingstekens.

    Weergegeven als Beschrijving
    *.txt Alle bestanden met .txt bestandsextensie.
    *.* Alle bestanden met een extensie.
    * Alle bestanden in de map op het hoogste niveau.
    .* Bestandsnamen beginnen met '.'.
    *word* Alle bestanden met 'word' in de bestandsnaam.
    readme.* Alle bestanden met de naam 'readme' met een bestandsextensie.
    styles/*.css Alle bestanden met extensie '.css' in de map 'styles/'.
    scripts/*/* Alle bestanden in 'scripts/' of één niveau van de submap onder 'scripts/'.
    images*/* Alle bestanden in een map met de naam die is of begint met 'images'.
  • Willekeurige mapdiepte (/**/).

    Weergegeven als Beschrijving
    **/* Alle bestanden in een submap.
    dir/ Alle bestanden in een submap onder 'dir/'.
    dir/**/* Alle bestanden in een submap onder 'dir/'.
  • Relatieve paden.

    Als u alle bestanden in een map met de naam 'gedeeld' op hetzelfde niveau wilt vergelijken met de basismap die is Matcher.Execute(DirectoryInfoBase)opgegeven, gebruikt ../shared/*u .

Voorbeelden

Bekijk de volgende voorbeeldmap en elk bestand in de bijbehorende map.

📁 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

Tip

Sommige bestandsextensies staan in hoofdletters, terwijl andere in kleine letters staan. StringComparer.OrdinalIgnoreCase Standaard wordt deze gebruikt. Gebruik de Matcher.Matcher(StringComparison) constructor om verschillende tekenreeksvergelijkingsgedrag op te geven.

Als u alle Markdown-bestanden wilt ophalen, waarbij de bestandsextensie .md of .mtext is, ongeacht hoofdletters:

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

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

Als u de toepassing uitvoert, worden de resultaten ongeveer als volgt uitgevoerd:

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

Als u bestanden in een map met assets op willekeurige diepte wilt ophalen:

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

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

Als u de toepassing uitvoert, worden de resultaten ongeveer als volgt uitgevoerd:

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

Als u bestanden wilt ophalen waarin de mapnaam het woord onderliggend woord op willekeurige diepte bevat en de bestandsextensies niet .md, .text of .mtext zijn:

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

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

Als u de toepassing uitvoert, worden de resultaten ongeveer als volgt uitgevoerd:

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

Zie ook