Fájlcsúcsolás a .NET-ben

Ebből a cikkből megtudhatja, hogyan használhatja a fájltömörítést a Microsoft.Extensions.FileSystemGlobbing NuGet-csomaggal. A glob kifejezés a helyettesítő karaktereken alapuló fájl- és könyvtárnevekre vonatkozó minták meghatározására szolgál. A globbing egy vagy több glob-minta definiálása, valamint a fájlok befogadó vagy kizárólagos egyezésekből való kinyerése.

Minták

Ha felhasználó által definiált minták alapján szeretné egyeztetni a fájlokat a fájlrendszerben, kezdje az Matcher objektum példányosításával. A Matcher példányok paraméter nélkül vagy paraméterrel System.StringComparison is létrehozhatók, amelyek belsőleg a minták fájlnevekhez való összehasonlítására szolgálnak. A Matcher következő additív módszereket teszi elérhetővé:

A AddExclude metódusok és AddInclude a metódusok is hívhatók tetszőleges számú alkalommal, hogy különböző fájlnévmintákat adjanak hozzá az eredmények kizárásához vagy belefoglalásához. Miután példányosított és Matcher hozzáadott mintákat, a rendszer ezt követően kiértékeli a kezdőkönyvtárban lévő egyezéseket a Matcher.Execute metódussal.

Bővítménymetelyek

Az Matcher objektum több bővítménymetódust is használ.

Több kizárás

Több kizáró minta hozzáadásához a következőt használhatja:

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

Másik lehetőségként több kizárási mintát is MatcherExtensions.AddExcludePatterns(Matcher, IEnumerable<String>[]) hozzáadhat egyetlen híváshoz:

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

Ez a bővítménymetódus iterálja az Ön nevében hívó AddExclude összes megadott mintát.

Több felvétel

Több belefoglalási minta hozzáadásához a következőket használhatja:

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

Másik lehetőségként több belefoglalási mintát is MatcherExtensions.AddIncludePatterns(Matcher, IEnumerable<String>[]) hozzáadhat egyetlen híváshoz:

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

Ez a bővítménymetódus iterálja az Ön nevében hívó AddInclude összes megadott mintát.

Az összes egyező fájl lekérése

Az összes egyező fájl lekéréséhez közvetlenül vagy közvetve kell hívnia Matcher.Execute(DirectoryInfoBase) . Ha közvetlenül szeretné meghívni, szüksége van egy keresési könyvtárra:

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.

Az előző C# kód:

Feljegyzés

A DirectoryInfoWrapper típus a Microsoft.Extensions.FileSystemGlobbing.Abstractions névtérben van definiálva, a DirectoryInfo típus pedig a System.IO névtérben van definiálva. A szükségtelen using utasítások elkerülése érdekében használhatja a megadott bővítménymetszeti módszereket.

Van egy másik bővítménymetódus, amely az egyező fájlokat IEnumerable<string> jelöli:

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.

Az előző C# kód:

  • Objektum példányosítása Matcher .
  • Több fájlnévminta hozzáadására irányuló hívások AddIncludePatterns(Matcher, IEnumerable<String>[]) .
  • Deklarálja és hozzárendeli a keresési könyvtár értékét.
  • searchDirectory Az összes egyező fájl IEnumerable<string>mintaként való hozamot eredményező hívás.GetResultsInFullPath

Túlterhelések egyeztetése

Az PatternMatchingResult objektum egy példánygyűjteményt FilePatternMatch jelöl, és egy boolean értéket tesz elérhetővé, amely jelzi, hogy az eredmény megegyezik-e .PatternMatchingResult.HasMatches

Egy Matcher példánnyal meghívhatja a különböző Match túlterhelések bármelyikét, hogy egy mintaegyeztetési eredményt kapjon. A Match metódusok megfordítják a hívó azon felelősségét, hogy olyan fájlt vagy fájlgyűjteményt adjanak meg, amelyben egyezéseket kell kiértékelni. Más szóval a hívó felelős azért, hogy átadja a fájlt a megfelelőnek.

Fontos

A túlterhelések használatakor Match a fájlrendszer I/O-jának használata nem történik meg. Az összes fájlküldő művelet a memóriában történik a példány belefoglalási és kizárási matcher mintáival. A túlterhelések Match paramétereinek nem kell teljesen minősített útvonalaknak lenniük. A rendszer az aktuális könyvtárat (Directory.GetCurrentDirectory()) használja, ha nincs megadva.

Egyetlen fájl egyeztetése:

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

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

Az előző C# kód:

  • Az .md fájlkiterjesztéssel rendelkező fájlokat tetszőleges könyvtármélységgel egyezik meg.
  • Ha egy file.md nevű fájl található az aktuális könyvtár egyik alkönyvtárában:
    • result.HasMatches lenne true.
    • és result.Files lenne egy egyezés.

A további Match túlterhelések hasonló módon működnek.

Mintaformátumok

A metódusokban és AddInclude a AddExclude metódusokban megadott minták a következő formátumokat használhatják több fájl vagy könyvtár egyeztetéséhez.

  • Pontos könyvtár vagy fájlnév

    • some-file.txt
    • path/to/file.txt
  • A fájl- és könyvtárnevek helyettesítő karakterei * , amelyek nullától több karakterig, elválasztó karaktereket nem tartalmazó karaktereket jelölnek.

    Érték Leírás
    *.txt Minden fájl .txt kiterjesztéssel.
    *.* Minden kiterjesztésű fájl.
    * A legfelső szintű címtárban lévő összes fájl.
    .* "." kezdetű fájlnevek.
    *word* A fájlnévben a "word" betűvel ellátott összes fájl.
    readme.* Minden "readme" nevű fájl bármely fájlkiterjesztéssel.
    styles/*.css A ".css" kiterjesztésű fájlok a "styles/" könyvtárban.
    scripts/*/* A "szkriptek/" vagy az alkönyvtárak egy szintje alatt található összes fájl a "szkriptek/" alatt.
    images*/* Egy mappában lévő összes fájl neve "képek" néven szerepel vagy kezdődik.
  • Tetszőleges könyvtármélység (/**/).

    Érték Leírás
    **/* Minden fájl egy alkönyvtárban.
    dir/ Minden fájl a "dir/" alkönyvtárban.
    dir/**/* Minden fájl a "dir/" alkönyvtárban.
  • Relatív elérési utak.

    Ha egy "megosztott" nevű könyvtárban lévő összes fájlt meg szeretne egyezni a testvérszinten a megadott alapkönyvtárral, használja a következőtMatcher.Execute(DirectoryInfoBase)../shared/*:

Példák

Vegye figyelembe a következő példakönyvtárat, és minden fájlt a megfelelő mappájában.

📁 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

Tipp.

Egyes fájlkiterjesztések nagybetűsek, míg mások kisbetűsek. Alapértelmezés szerint StringComparer.OrdinalIgnoreCase a rendszer használja. A sztringek összehasonlítási viselkedésének megadásához használja a konstruktort Matcher.Matcher(StringComparison) .

Az összes markdown-fájl lekéréséhez, ahol a fájlkiterjesztés .md vagy .mtext, karakteres esettől függetlenül:

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

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

Az alkalmazás futtatása az alábbihoz hasonló eredményeket eredményez:

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

Ha tetszőleges mélységben szeretne fájlokat lekérni egy eszközkönyvtárban :

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

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

Az alkalmazás futtatása az alábbihoz hasonló eredményeket eredményez:

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

Ha olyan fájlokat szeretne lekérni, amelyekben a könyvtár neve tetszőleges mélységben tartalmazza a gyermek szót, és a fájlkiterjesztések nem .md, .text vagy .mtext:

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

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

Az alkalmazás futtatása az alábbihoz hasonló eredményeket eredményez:

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

Lásd még