Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede, NuGet paketiyle dosya genelleme özelliğini 📦 Microsoft.Extensions.FileSystemGlobbing kullanmayı öğreneceksiniz.
Glob, joker karakterlere göre eşleşen dosya ve dizin adlarının desenlerini tanımlamak için kullanılan bir terimdir. Globbing, bir veya daha fazla glob deseni tanımlama ve kapsayıcı veya özel eşleşmelerden dosya verme işlemidir.
Desenler
Dosya sistemindeki dosyaları kullanıcı tanımlı desenlere göre eşleştirmek için, bir Matcher nesne örneği oluşturarak başlayın. , Matcher parametre olmadan veya desenleri dosya adlarıyla karşılaştırmak için dahili olarak kullanılan bir System.StringComparison parametreyle örneklenebilir. aşağıdaki Matcher ek yöntemleri kullanıma sunar:
Hem AddExclude hem de AddInclude yöntemleri, sonuçlardan dışlanacak veya sonuçlara dahil edilecek çeşitli dosya adı desenlerini eklemek için herhangi bir sayıda çağrılabilir. Bir Matcher örneğini oluşturup desenleri ekledikten sonra, Matcher.Execute yöntemini bir başlangıç dizininden eşleşmeleri değerlendirmek için kullanabilirsiniz.
Genişletme yöntemleri
Nesnenin Matcher çeşitli uzantı yöntemleri vardır.
Birden çok dışlama
Birden çok dışlama deseni eklemek için şunları kullanabilirsiniz:
Matcher matcher = new();
matcher.AddExclude("*.txt");
matcher.AddExclude("*.asciidoc");
matcher.AddExclude("*.md");
Alternatif olarak, tek bir çağrıda birden çok dışlama deseni eklemek için MatcherExtensions.AddExcludePatterns(Matcher, IEnumerable<String>[]) öğesini kullanabilirsiniz.
Matcher matcher = new();
matcher.AddExcludePatterns(new [] { "*.txt", "*.asciidoc", "*.md" });
Bu uzantı yöntemi, tüm sağlanan desenler üzerinde sizin adınıza AddExclude çağırarak yinelenir.
Birden çok ekleme
Birden fazla dahil etme deseni eklemek için şunları kullanabilirsiniz:
Matcher matcher = new();
matcher.AddInclude("*.txt");
matcher.AddInclude("*.asciidoc");
matcher.AddInclude("*.md");
Alternatif olarak, birden çok dahil etme desenini tek bir çağrıda eklemek için MatcherExtensions.AddIncludePatterns(Matcher, IEnumerable<String>[]) öğesini kullanabilirsiniz.
Matcher matcher = new();
matcher.AddIncludePatterns(new[] { "*.txt", "*.asciidoc", "*.md" });
Bu uzantı yöntemi, tüm sağlanan desenler üzerinde sizin adınıza AddInclude çağırarak yinelenir.
Eşleşen tüm dosyaları alma
Eşleşen tüm dosyaları almak için doğrudan veya dolaylı olarak aramanız Matcher.Execute(DirectoryInfoBase) gerekir. Doğrudan çağırmak için bir arama dizinine ihtiyacınız vardır:
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.
Yukarıdaki C# kodu:
- Matcher nesnesinin bir örneğini oluşturur.
- Birkaç dosya adı desenini eklemek için AddIncludePatterns(Matcher, IEnumerable<String>[]) çağrılır.
- Arama dizini değerini bildirir ve atar.
- Verilen DirectoryInfoiçinden bir
searchDirectoryörneği oluşturur. - Sarmaladığı DirectoryInfoWrapper'den bir
DirectoryInfoörneği oluşturur. -
ExecuteverilenDirectoryInfoWrapperörneği, bir PatternMatchingResult nesnesi oluşturmak için çağrılır.
Not
DirectoryInfoWrapper türü Microsoft.Extensions.FileSystemGlobbing.Abstractions ad alanında tanımlıdır ve DirectoryInfo türü System.IO ad alanında tanımlıdır. Gereksiz using yönergeleri önlemek için sağlanan uzantı yöntemlerini kullanabilirsiniz.
Eşleşen dosyaları temsil eden bir IEnumerable<string> başka uzantı yöntemi vardır:
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.
Yukarıdaki C# kodu:
- Matcher nesnesinin bir örneğini oluşturur.
- Birkaç dosya adı desenini eklemek için AddIncludePatterns(Matcher, IEnumerable<String>[]) çağrılır.
- Arama dizini değerini bildirir ve atar.
-
GetResultsInFullPath,searchDirectorydeğerini vererek tüm eşleşen dosyaları birIEnumerable<string>olarak çağırır.
Aşırı yüklemeleri eşleştirme
PatternMatchingResult nesnesi, FilePatternMatch örneklerinden oluşan bir koleksiyonu temsil eder ve sonucun eşleşmeler içerip içermediğini belirten bir boolean değeri ortaya koyar.
Bir Matcher örnekle, desen eşleştirme sonucu almak için çeşitli Match aşırı yüklemelerden herhangi birini çağırabilirsiniz.
Match yöntemleri, eşleşmeleri değerlendirmek için bir dosya veya dosya koleksiyonu sağlama sorumluluğunu çağırandan alır ve ona devreder. Başka bir deyişle, çağrıyı yapan kişi, eşleştirme için dosyayı geçirmekten sorumludur.
Önemli
Aşırı yüklemelerden herhangi birini Match kullanırken, dosya sistemi G/Ç'si yoktur.
matcher örneğinin dahil etme ve dışlama desenleri ile ilgili tüm dosya glob işlemleri bellekte gerçekleştirilir. Aşırı yüklemelerin parametrelerinin tam olarak belirtilmiş yollar olması gerekmez. Geçerli dizin (Directory.GetCurrentDirectory()) belirtilmediğinde kullanılır.
Tek bir dosyayla eşleştirmek için:
Matcher matcher = new();
matcher.AddInclude("**/*.md");
PatternMatchingResult result = matcher.Match("file.md");
Yukarıdaki C# kodu:
- Herhangi bir dosyayı rastgele dizin derinliğinde .md dosya uzantısıyla eşleştirir.
- geçerli dizinden bir alt dizinde file.md adlı bir dosya varsa:
-
result.HasMatchesolacaktırtrue. - ve
result.Filestek bir eşleşmeye sahip olur.
-
Ek Match aşırı yüklemeler benzer şekillerde çalışır.
Ekleme/hariç tutmanın sıralı değerlendirmesi
Varsayılan olarak, eşleştirici önce tüm dahil etme desenlerini değerlendirir, sonra bunları eklediğiniz sıraylan bağımsız olarak tüm dışlama desenlerini uygular. Bu, daha önce dışlanmış dosyaları yeniden ekleyememenizi sağlar.
Microsoft.Extensions.FileSystemGlobbing paketinin📦 10. sürümünden itibaren, dahil etme ve dışlamaların tam olarak eklendikleri sırada işlendiği sıralı değerlendirmeyi kabul edebilirsiniz:
using Microsoft.Extensions.FileSystemGlobbing;
// Preserve the order of patterns when matching.
Matcher matcher = new(preserveFilterOrder: true);
matcher.AddInclude("**/*"); // include everything
matcher.AddExclude("logs/**/*"); // exclude logs
matcher.AddInclude("logs/important/**/*"); // re-include important logs
var result = matcher.Execute(new DirectoryInfoWrapper(new DirectoryInfo(root)));
foreach (var file in result.Files)
{
Console.WriteLine(file.Path);
}
Bu modda desenler birbiri ardına uygulanır:
-
**/*tüm dosyaları ekler. -
logs/**/*,logs/içindeki her şeyi filtreler. -
logs/important/**/*altındalogs/important/yalnızca dosyaları geri ekler.
Varsayılan oluşturucuyu kullanan mevcut kod özgün "tümü dahil, sonra tüm dışlar" davranışıyla çalışmaya devam eder.
Desen biçimleri
ve AddExclude yöntemlerinde AddInclude belirtilen desenler, birden çok dosya veya dizinle eşleştirmek için aşağıdaki biçimleri kullanabilir.
Tam dizin veya dosya adı
some-file.txtpath/to/file.txt
Dosya ve dizin adlarında kullanılan joker
*karakterler, ayırıcı karakterler dışındaki sıfır veya daha fazla karakteri temsil eder.Değer Açıklama *.txt.txt dosya uzantısına sahip tüm dosyalar. *.*Uzantılı tüm dosyalar. *Üst düzey dizindeki tüm dosyalar. .*'.' ile başlayan dosya adları. *word*Dosya adında 'word' bulunan tüm dosyalar. readme.*Herhangi bir dosya uzantısına sahip 'readme' adlı tüm dosyalar. styles/*.css'styles/' dizinindeki '.css' uzantısına sahip tüm dosyalar. scripts/*/*'script/' içindeki tüm dosyalar veya 'scripts/' altındaki bir alt dizin düzeyi. images*/*'Images' ile başlayan ya da adı 'images' olan bir klasördeki tüm dosyalar. Rastgele dizin derinliği (
/**/).Değer Açıklama **/*Herhangi bir alt dizindeki tüm dosyalar. dir/'dir/' altındaki herhangi bir alt dizindeki tüm dosyalar. dir/**/*'dir/' altındaki herhangi bir alt dizindeki tüm dosyalar. Göreli yollar.
"shared" adlı bir dizindeki tüm dosyaları aynı düzeyde Matcher.Execute(DirectoryInfoBase)'e verilen temel dizine eşleştirmek için
../shared/*kullanın.
Örnekler
Aşağıdaki örnek dizini ve ilgili klasördeki her dosyayı göz önünde bulundurun.
📁 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
İpucu
Bazı dosya uzantıları büyük harfle, bazıları ise küçük harfle. Varsayılan olarak StringComparer.OrdinalIgnoreCase kullanılır. Farklı dize karşılaştırma davranışı belirtmek için oluşturucuyu Matcher.Matcher(StringComparison) kullanın.
Karakter durumundan bağımsız olarak dosya uzantısının .md veya .mtext olduğu tüm markdown dosyalarını almak için:
Matcher matcher = new();
matcher.AddIncludePatterns(new[] { "**/*.md", "**/*.mtext" });
foreach (string file in matcher.GetResultsInFullPath("parent"))
{
Console.WriteLine(file);
}
Uygulama çalıştırılırsa aşağıdakine benzer sonuçlar elde edilir:
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
Assets dizinindeki dosyaları herhangi bir derinlikte almak için:
Matcher matcher = new();
matcher.AddInclude("**/assets/**/*");
foreach (string file in matcher.GetResultsInFullPath("parent"))
{
Console.WriteLine(file);
}
Uygulama çalıştırılırsa aşağıdakine benzer sonuçlar elde edilir:
C:\app\parent\child\assets\image.png
C:\app\parent\child\assets\image.svg
Dizin adında herhangi bir derinlikte child kelimesi geçen ve dosya uzantıları .md, .text veya .mtext olmayan dosyaları almak için:
Matcher matcher = new();
matcher.AddInclude("**/*child/**/*");
matcher.AddExcludePatterns(
new[]
{
"**/*.md", "**/*.text", "**/*.mtext"
});
foreach (string file in matcher.GetResultsInFullPath("parent"))
{
Console.WriteLine(file);
}
Uygulama çalıştırılırsa aşağıdakine benzer sonuçlar elde edilir:
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