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:
- 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.
- Instantieert een DirectoryInfo van de opgegeven
searchDirectory
. - Instantieert een DirectoryInfoWrapper van de
DirectoryInfo
folies. - Aanroepen
Execute
die hetDirectoryInfoWrapper
exemplaar heeft gegeven om een PatternMatchingResult object te genereren.
Notitie
Het DirectoryInfoWrapper
type wordt gedefinieerd in de Microsoft.Extensions.FileSystemGlobbing.Abstractions
naamruimte en het DirectoryInfo
type wordt gedefinieerd in de System.IO
naamruimte. U kunt de meegeleverde uitbreidingsmethoden gebruiken om onnodige using
instructies te voorkomen.
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 desearchDirectory
waarde hebben gegeven om alle overeenkomende bestanden als eenIEnumerable<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 zijntrue
.- 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