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:
- 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.
- Példányosít egy DirectoryInfo adott
searchDirectory
. - Létrehoz egy példányt DirectoryInfoWrapper a
DirectoryInfo
körbefuttatásból. - Meghívja
Execute
a példánytDirectoryInfoWrapper
, hogy egy objektumot PatternMatchingResult adjon meg.
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
irányelvek 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ájlIEnumerable<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
lennetrue
.- é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