Beschreibung:
Diese Klasse verarbeitet Pfadangaben, welche Platzhalter auf mehreren Ebenen enthält,
z.B: "C:\Users\*\*\*d*" oder "C:\te?t\*\q12???8*\*.xls*"
unterstützt relative Angaben, wie z.B. "..\..\*\*", welches auch relative resultate liefert
Verwendung:
Die Verwendung ist einfach:
C#-Code: |
string[] Files = MaskMatch.Match(@"C:\Users\*\*\*d*", MatchType.All);
|
Mit dem MatchType kann angegeben werden, ob der letzte Pfadabschnitt Dateien, Verzeichnisse oder beides sucht.
Performance:
Hat mit dem Beispielaufruf oben 616 Dateien in 200 ms gefunden bei mir.
C#-Code: |
using System;
using System.Collections.Generic;
using System.IO;
[Flags]
public enum MatchType : int
{
File = 1,
Directory = 2,
All = File | Directory
}
public static class MaskMatch
{
private static readonly char[] Masks = new char[] { '*', '?' };
public static string[] Match(string Mask, MatchType Condition)
{
List<string> Matches = new List<string>();
string[] Patterns = getPatterns(Mask);
for (int i = 0; i < Patterns.Length; i++)
{
if (i == 0)
{
if ((Condition & MatchType.Directory) > 0 || i < Patterns.Length - 1)
{
Matches.AddRange(getDirectories(Patterns[i]));
}
if ((Condition & MatchType.File) > 0)
{
Matches.AddRange(getFiles(Patterns[i]));
}
}
else
{
string[] temp = Matches.ToArray();
Matches.Clear();
foreach (string d in temp)
{
if ((Condition & MatchType.Directory) > 0 || i < Patterns.Length - 1)
{
Matches.AddRange(getDirectories(Path.Combine(d, Patterns[i])));
}
if ((Condition & MatchType.File) > 0)
{
Matches.AddRange(getFiles(Path.Combine(d, Patterns[i])));
}
}
}
}
return Matches.ToArray();
}
public static string[] Match(string[] Masks, MatchType Condition, bool RemoveDuplicates)
{
List<string> L = new List<string>();
foreach (string Mask in Masks)
{
string[] result = Match(Mask, Condition);
if (RemoveDuplicates)
{
foreach (string entry in result)
{
if (!L.Contains(entry))
{
L.Add(entry);
}
}
}
else
{
L.AddRange(result);
}
}
return L.ToArray();
}
private static string[] getPatterns(string Mask)
{
List<string> Patterns = new List<string>();
string[] temp = Mask.Split(Path.DirectorySeparatorChar);
string current = temp[0] + (temp[0].Contains(":") ? Path.DirectorySeparatorChar.ToString() : string.Empty);
for (int i = 1; i < temp.Length; i++)
{
if (temp[i].IndexOfAny(Masks) >= 0)
{
Patterns.Add(Path.Combine(current, temp[i]));
current = string.Empty;
}
else
{
current = Path.Combine(current, temp[i]);
}
}
return Patterns.ToArray();
}
private static string[] getDirectories(string Mask)
{
string Dir = Mask.Substring(0, Mask.LastIndexOf(Path.DirectorySeparatorChar));
string Arg = Mask.Substring(Mask.LastIndexOf(Path.DirectorySeparatorChar) + 1);
try
{
return Directory.GetDirectories(Dir, Arg);
}
catch
{
}
return new string[0];
}
private static string[] getFiles(string Mask)
{
string Dir = Mask.Substring(0, Mask.LastIndexOf(Path.DirectorySeparatorChar));
string Arg = Mask.Substring(Mask.LastIndexOf(Path.DirectorySeparatorChar) + 1);
try
{
return Directory.GetFiles(Dir, Arg);
}
catch
{
}
return new string[0];
}
}
|
Lizenz: WTFPL. Namensnennung (AyrA) wäre nett aber nicht erforderlich.
Ausnahmsweise mal auf Deutsch kommentiert.
Habe diese Klasse erstellt, weil ich im Internet nichts passendes gefunden habe, was nur das macht und nicht mehr.
Schlagwörter: Pfad Datei Suchpfad Dateien Mask Maske Wildcard