Directory.GetFiles () Musterübereinstimmung in C #
-
09-10-2019 - |
Frage
Ich verwende Directory.GetFiles()
zur Liste Dateien nach vorgegebenen Mustern. Dies funktioniert gut für die meisten Muster Ich suche (z zip, rar, SFV).
Dies ist, wie ich die Liste vorbereiten (mehr oder weniger). Das Problem ist, mit Mustern von Zahlen 0,001-0,999, dass ich Liste.
alArrayPatternText.Add("*.zip");
alArrayPatternText.Add("*.sfv");
alArrayPatternText.Add("*.r??");
alArrayPatternText.Add("*.001");
for (int i = 2; i <= 999; i++)
{
string findNumber = String.Format("{0:000}", i);
alArrayPatternText.Add("*." + findNumber);
}
Ich rufe dann
string[] files = Directory.GetFiles(strDirName, varPattern);
für jedes Muster im Array, die wie sehr schlechte Idee scheint so zu tun, da die Liste 1002 Einträge hat und prüfen, ob Verzeichnis hat jeder von ihnen ist nur ein bisschen zu zeitaufwendig.
Gäbe es einen besseren Weg, dies zu tun?
Lösung
Sie sollten Directory.EnumerateFiles("path", "*")
anrufen und dann LINQ verwenden, um die Pfade zu filtern, indem Path.GetExtension
aufrufen.
Zum Beispiel:
var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) {
".zip", ".sfv"
};
extensions.UnionWith(Enumerable.Range(1, 998).Select(i => i.ToString(".000")));
var files = Directory.EnumerateFiles("path", "*")
.Where(p => extensions.Contains(Path.GetExtension(p))
|| Path.GetExtension(p).StartsWith(".r", StringComparison.OrdinalIgnoreCase));
Andere Tipps
Meine letzte Methode basiert auf SLaks für alle beantworten für ähnliche Lösung suchen
private static IEnumerable<string> DirectoryGetFiles(string strDirName, SearchOption varOption) {
var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { ".zip", ".sfv" };
extensions.UnionWith(Enumerable.Range(1, 999).Select(i => String.Format(".{0:000}", i)));
extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".r{0:00}", i)));
extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".s{0:00}", i)));
extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".t{0:00}", i)));
return Directory.EnumerateFiles(strDirName, "*.*", varOption).Where(p => extensions.Contains(Path.GetExtension(p))).ToList();
}