Sdílet prostřednictvím


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#:

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 hodnotou searchDirectory , která by přinesla všechny odpovídající soubory jako IEnumerable<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 bylo true.
    • 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

Viz také