Globbing souborů v .NET
V tomto článku se dozvíte, jak používat globbing souborů s balíčkem Microsoft.Extensions.FileSystemGlobbing
NuGet. Glob je termín, který slouží k definování vzorů pro odpovídající názvy souborů a adresářů na základě zástupných znaků. Globbing je akce definování jednoho nebo více vzorů globů a získávání souborů z inkluzivních nebo exkluzivních shod.
Vzory
Pokud chcete soubory v systému souborů spárovat na základě uživatelem definovaných vzorů, začněte vytvořením instance objektu Matcher . Je Matcher
možné vytvořit instanci bez parametrů nebo s parametrem System.StringComparison , který se používá interně pro porovnání vzorů s názvy souborů. Zveřejňuje Matcher
následující doplňkové metody:
Obě AddExclude
metody AddInclude
lze volat libovolný počet, pokud chcete přidat různé vzory názvů souborů pro vyloučení nebo zahrnutí z výsledků. Po vytvoření instance Matcher
a přidání vzorů se pak použije k vyhodnocení shody z počátečního adresáře pomocí Matcher.Execute metody.
Metody rozšíření
Objekt Matcher
má několik rozšiřujících metod.
Více vyloučení
Pokud chcete přidat více vzorů vyloučení, můžete použít:
Matcher matcher = new();
matcher.AddExclude("*.txt");
matcher.AddExclude("*.asciidoc");
matcher.AddExclude("*.md");
Alternativně můžete použít MatcherExtensions.AddExcludePatterns(Matcher, IEnumerable<String>[]) k přidání více vzorů vyloučení v jednom volání:
Matcher matcher = new();
matcher.AddExcludePatterns(new [] { "*.txt", "*.asciidoc", "*.md" });
Tato metoda rozšíření iteruje nad všemi zadanými vzory volajícími AddExclude vaším jménem.
Více zahrnutí
Pokud chcete přidat více vzorů zahrnutí, můžete použít:
Matcher matcher = new();
matcher.AddInclude("*.txt");
matcher.AddInclude("*.asciidoc");
matcher.AddInclude("*.md");
Alternativně můžete použít MatcherExtensions.AddIncludePatterns(Matcher, IEnumerable<String>[]) k přidání více vzorů zahrnutí do jednoho volání:
Matcher matcher = new();
matcher.AddIncludePatterns(new[] { "*.txt", "*.asciidoc", "*.md" });
Tato metoda rozšíření iteruje nad všemi zadanými vzory volajícími AddInclude vaším jménem.
Získání všech odpovídajících souborů
Pokud chcete získat všechny odpovídající soubory, musíte volat Matcher.Execute(DirectoryInfoBase) buď přímo, nebo nepřímo. Pokud ho chcete volat přímo, potřebujete vyhledávací adresář:
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.
Předchozí kód jazyka C#:
- Vytvoří instanci objektu Matcher .
- Volání AddIncludePatterns(Matcher, IEnumerable<String>[]) pro přidání několika vzorů názvů souborů, které se mají zahrnout.
- Deklaruje a přiřazuje hodnotu vyhledávacího adresáře.
- DirectoryInfo Vytvoří instanci daného objektu
searchDirectory
. - DirectoryInfoWrapper Vytvoří instanci z
DirectoryInfo
obtékání. - Volání
Execute
poskytnutaDirectoryInfoWrapper
instanci k výnosu objektu PatternMatchingResult .
Poznámka:
Typ DirectoryInfoWrapper
je definován v Microsoft.Extensions.FileSystemGlobbing.Abstractions
oboru názvů a DirectoryInfo
typ je definován v System.IO
oboru názvů. Pokud se chcete vyhnout zbytečným using
direktivám, můžete použít poskytnuté rozšiřující metody.
Existuje další metoda rozšíření, která poskytuje IEnumerable<string>
reprezentaci odpovídajících souborů:
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.
Předchozí kód jazyka C#:
- Vytvoří instanci objektu Matcher .
- Volání AddIncludePatterns(Matcher, IEnumerable<String>[]) pro přidání několika vzorů názvů souborů, které se mají zahrnout.
- Deklaruje a přiřazuje hodnotu vyhledávacího adresáře.
- Volání
GetResultsInFullPath
s hodnotousearchDirectory
, která by přinesla všechny odpovídající soubory jakoIEnumerable<string>
.
Shoda přetížení
Objekt PatternMatchingResult představuje kolekci FilePatternMatch instancí a zveřejňuje boolean
hodnotu určující, zda výsledek odpovídá –PatternMatchingResult.HasMatches
Matcher
U instance můžete volat libovolnou z různých Match
přetížení, abyste získali výsledek porovnávání vzorů. Match
Metody invertují odpovědnost volajícího za poskytnutí souboru nebo kolekce souborů, ve kterých se mají vyhodnotit shody. Jinými slovy, volající zodpovídá za předání souboru tak, aby odpovídal.
Důležité
Při použití některého z Match
přetížení neexistuje žádný vstupně-výstupní operace systému souborů. Všechny globbingy souborů se provádějí v paměti s zahrnutím a vyloučením vzorů matcher
instance. Parametry Match
přetížení nemusí být plně kvalifikované cesty. Aktuální adresář (Directory.GetCurrentDirectory()) se použije, pokud není zadaný.
Jak se shodovat s jedním souborem:
Matcher matcher = new();
matcher.AddInclude("**/*.md");
PatternMatchingResult result = matcher.Match("file.md");
Předchozí kód jazyka C#:
- Odpovídá libovolnému souboru s příponou souboru .md s libovolnou hloubkou adresáře.
- Pokud soubor s názvem file.md existuje v podadresáři z aktuálního adresáře:
result.HasMatches
by to bylotrue
.- a
result.Files
měla by jednu shodu.
Další Match
přetížení fungují podobným způsobem.
Formáty vzorů
Vzory zadané v těchto AddExclude
metodách AddInclude
můžou použít následující formáty, aby odpovídaly více souborům nebo adresářům.
Přesný název adresáře nebo souboru
some-file.txt
path/to/file.txt
Zástupné znaky v názvechsouborůch
*
Hodnota Popis *.txt
Všechny soubory s příponou .txt . *.*
Všechny soubory s příponou. *
Všechny soubory v adresáři nejvyšší úrovně. .*
Názvy souborů začínající na ".". *word*
Všechny soubory s slovem v názvu souboru. readme.*
Všechny soubory s názvem readme s libovolnou příponou souboru. styles/*.css
Všechny soubory s příponou ".css" v adresáři "styles/". scripts/*/*
Všechny soubory ve skriptech/nebo jedné úrovni podadresáře v části scripts/. images*/*
Všechny soubory ve složce s názvem, který je nebo začíná na "images". Hloubka libovolného adresáře (
/**/
).Hodnota Popis **/*
Všechny soubory v libovolném podadresáři. dir/
Všechny soubory v libovolném podadresáři v adresáři dir/. dir/**/*
Všechny soubory v libovolném podadresáři v adresáři dir/. Relativní cesty.
Chcete-li se shodovat se všemi soubory v adresáři s názvem "shared" na úrovni na stejné úrovni jako základní adresář zadaný Matcher.Execute(DirectoryInfoBase), použijte
../shared/*
.
Příklady
Podívejte se na následující příklad adresáře a každý soubor v příslušné složce.
📁 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
Některé přípony souborů jsou velké, zatímco jiné jsou malými písmeny. Ve výchozím nastavení StringComparer.OrdinalIgnoreCase se používá. Chcete-li zadat jiné chování porovnání řetězců, použijte Matcher.Matcher(StringComparison) konstruktor.
Pokud chcete získat všechny soubory markdownu, kde přípona souboru je .md nebo .mtext bez ohledu na velikost znaků:
Matcher matcher = new();
matcher.AddIncludePatterns(new[] { "**/*.md", "**/*.mtext" });
foreach (string file in matcher.GetResultsInFullPath("parent"))
{
Console.WriteLine(file);
}
Spuštění aplikace by výstup výsledky podobné následujícímu:
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
Pokud chcete získat jakékoli soubory v adresáři prostředků v libovolné hloubkě:
Matcher matcher = new();
matcher.AddInclude("**/assets/**/*");
foreach (string file in matcher.GetResultsInFullPath("parent"))
{
Console.WriteLine(file);
}
Spuštění aplikace by výstup výsledky podobné následujícímu:
C:\app\parent\child\assets\image.png
C:\app\parent\child\assets\image.svg
Chcete-li získat všechny soubory, ve kterých název adresáře obsahuje podřízené slovo v libovolné hloubkě a přípony souborů nejsou .md, .text ani .mtext:
Matcher matcher = new();
matcher.AddInclude("**/*child/**/*");
matcher.AddExcludePatterns(
new[]
{
"**/*.md", "**/*.text", "**/*.mtext"
});
foreach (string file in matcher.GetResultsInFullPath("parent"))
{
Console.WriteLine(file);
}
Spuštění aplikace by výstup výsledky podobné následujícímu:
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