.NET'te dosya globing
Bu makalede, dosya globing'i uygulama paketiyle birlikte NuGet Microsoft.Extensions.FileSystemGlobbing öğrenirsiniz. Glob, joker karakterlere göre eşleşen dosya ve dizin adlarının desenlerini tanımlamak için kullanılan bir terimdir. Globlama, bir veya daha fazla glob deseni tanımlama ve kapsayıcı ya da özel eşleşmelerden dosya elde etmektir.
Desenler
Kullanıcı tanımlı desenlere göre dosya sistemi dosyalarıyla eşleşmek için bir nesne örneği başlatarak Matcher başlayabilirsiniz. bir örneği, parametre ile veya desenlerle dosya adlarını karşılaştırmak için dahili olarak kullanılan Matcher System.StringComparison bir parametreyle örnek olabilir. , Matcher aşağıdaki ek yöntemleri ortaya çıkarır:
Sonuçları dışlamak veya sonuçları dahil etmek için çeşitli dosya adı desenleri eklemek için ve yöntemlerinin her AddExclude ikisi de herhangi bir sayıda AddInclude çağrılabilirsiniz. Bir örneği ve desenler eklediniz sonra yöntemiyle bir başlangıç dizininden Matcher eşleşmeleri değerlendirmek için Matcher.Execute kullanılır.
Genişletme yöntemleri
nesnesinin Matcher birkaç genişletme yöntemi 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 MatcherExtensions.AddExcludePatterns(Matcher, IEnumerable<String>[]) çağrıda birden çok dışlama deseni eklemek için kullanabilirsiniz:
Matcher matcher = new();
matcher.AddExcludePatterns(new [] { "*.txt", "*.asciidoc", "*.md" });
Bu genişletme yöntemi, sizin adına çağrı yapan tüm sağlanan AddExclude desenleri tekrarlar.
Birden çok ekleme
Birden çok ekleme deseni eklemek için şunları kullanabilirsiniz:
Matcher matcher = new();
matcher.AddInclude("*.txt");
matcher.AddInclude("*.asciidoc");
matcher.AddInclude("*.md");
Alternatif olarak, tek bir MatcherExtensions.AddIncludePatterns(Matcher, IEnumerable<String>[]) çağrıda birden çok ekleme deseni eklemek için kullanabilirsiniz:
Matcher matcher = new();
matcher.AddIncludePatterns(new[] { "*.txt", "*.asciidoc", "*.md" });
Bu genişletme yöntemi, sizin adına çağrı yapan tüm sağlanan AddInclude desenleri tekrarlar.
Eşleşen tüm dosyaları al
Eşleşen tüm dosyaları almak için doğrudan veya Matcher.Execute(DirectoryInfoBase) dolaylı olarak çağrısı yapmak gerekir. Doğrudan çağrı yapmak için bir arama dizini gerekir:
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:
- Bir nesnesinin örneğini Matcher oluşturur.
- Dahil AddIncludePatterns(Matcher, IEnumerable<String>[]) etmek için birkaç dosya adı deseni eklemek için çağrıları.
- Arama dizini değerini belirtir ve atar.
- Verilen 'den DirectoryInfo bir örneği
searchDirectoryhazırlar. - Sarmalar içinde DirectoryInfoWrapper bir
DirectoryInfoörneği sağlar. - Nesne
Executevermek için örneği verilenDirectoryInfoWrapperPatternMatchingResult çağrıları.
Not
Tür DirectoryInfoWrapper ad alanı Microsoft.Extensions.FileSystemGlobbing.Abstractions içinde, tür DirectoryInfo ise ad alanı içinde System.IO tanımlanır. Gereksiz deyimleri using önlemek için sağlanan uzantı yöntemlerini kullanabilirsiniz.
Eşleşen dosyaları temsil eden başka bir uzantı IEnumerable<string> 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:
- Bir nesnesinin örneğini Matcher oluşturur.
- Dahil AddIncludePatterns(Matcher, IEnumerable<String>[]) etmek için birkaç dosya adı deseni eklemek için çağrıları.
- Arama dizini değerini belirtir ve atar.
- Eşleşen
GetResultsInFullPathtüm dosyaları olarak teslim etmek için değeri verilensearchDirectoryIEnumerable<string>çağrıları.
Aşırı yüklemeleri eşle
nesnesi bir örnek koleksiyonunu temsil eder ve sonucun ile eş olup olmadığını PatternMatchingResult FilePatternMatch belirten bir değeri boolean — PatternMatchingResult.HasMatches gösterir.
Bir Matcher örnekle, desen eşleştirme sonucu almak için çeşitli Match aşırı yüklemelerden herhangi birini çağırabileceğiniz. Metotlar, eşleşmeleri değerlendirmek için bir dosya veya dosya koleksiyonu sağlamak Match için çağıranın sorumluluğunu tersine çevirer. Başka bir deyişle, çağıranın eşleşmesi için dosyayı geçirmesi gerekir.
Önemli
Aşırı yüklemelerden Match herhangi birini kullanırken, hiçbir dosya sistemi I/O's söz konusu olmaz. Tüm dosya globlama, örneğin dahil ve dışlama düzenleriyle bellekte matcher yapılır. Aşırı yükleme Match parametrelerinin tam yol olması gerekli değildir. Belirtilmezse geçerli dizin ( Directory.GetCurrentDirectory() ) kullanılır.
Tek bir dosyayla eşleşmek için:
Matcher matcher = new();
matcher.AddInclude("**/*.md");
PatternMatchingResult result = matcher.Match("file.md");
Yukarıdaki C# kodu:
- Rastgele bir dizin derinliğinde .md dosya uzantısına sahip herhangi bir dosyayla eşler.
- file.md adlı bir dosya geçerli dizinden bir alt dizinde bulunuyorsa:
result.HasMatches,trueolur.- ve
result.Filesbir eşleşmeye sahip olur.
Ek aşırı Match yüklemeler de benzer şekilde çalışır.
Desen biçimleri
ve yöntemlerinde belirtilen AddExclude desenler, birden çok dosya veya AddInclude dizinle eşleşmek için aşağıdaki biçimleri kullanabilir.
Tam dizin veya dosya adı
some-file.txtpath/to/file.txt
Ayırıcı karakterler
*dahil olmak üzere sıfır ile çok sayıda karakteri temsil eden dosya ve dizin adlarında joker karakterler.Değer Açıklama *.txtDosya uzantısı .txt tüm dosyalar. *.*Uzantılı tüm dosyalar. *Üst düzey dizinde yer alan tüm dosyalar. .*Dosya adları '.' ile başlar. *word*Dosya adı içinde 'word' olan tüm dosyalar. readme.*Herhangi bir dosya uzantısına sahip 'readme' adlı tüm dosyalar. styles/*.css'styles/' dizininde '.css' uzantısına sahip tüm dosyalar. scripts/*/*'scripts/' veya 'scripts/' altındaki bir alt dizin düzeyine sahip tüm dosyalar. images*/*Bir klasördeki adı veya "images" ile başlayan tüm dosyalar. Rastgele dizin derinliği (
/**/).Değer Açıklama **/*Herhangi bir alt dizinde yer alan tüm dosyalar. dir/**/*'dir/' altındaki herhangi bir alt dizinde yer alan tüm dosyalar. Göreli yollar.
Eşdüzdüz düzeyinde "shared" adlı bir dizinde yer alan tüm dosyaları verilen temel dizinle eşleşmek için Matcher.Execute(DirectoryInfoBase)
../shared/*kullanın.
Örnekler
Aşağıdaki örnek dizini ve karşılık gelen klasöründeki her dosyayı göz önünde bulundurabilirsiniz.
📁 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 harfledir. Varsayılan olarak StringComparer.OrdinalIgnoreCase kullanılır. Farklı dize karşılaştırma davranışını belirtmek için oluşturucusu Matcher.Matcher(StringComparison) kullanın.
Karakterden 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);
}
Uygulamayı çalıştırma, aşağıdakine benzer sonuçlar verir:
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 dizininde rastgele bir derinlikte herhangi bir dosya almak için:
Matcher matcher = new();
matcher.AddInclude("**/assets/**/*");
foreach (string file in matcher.GetResultsInFullPath("parent"))
{
Console.WriteLine(file);
}
Uygulamayı çalıştırma, aşağıdakine benzer sonuçlar verir:
C:\app\parent\child\assets\image.png
C:\app\parent\child\assets\image.svg
Dizin adının rastgele bir derinlikte alt sözcük içerdiği ve dosya uzantılarının .md, .text veya .mtext olmadığını içeren 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);
}
Uygulamayı çalıştırma, aşağıdakine benzer sonuçlar verir:
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